Clasa a XII-a · Structuri de date și STLRead in English

pair — reuniunea intervalelor în C++

În engleză: pair: union of intervals

O(n log n)C++1759 de linii1 exemplu

Ideea

pair<int, int> grupează două valori (first, second) și se compară lexicografic: întâi după first, apoi după second. Așadar sort pe un vector de perechi ordonează intervalele după capătul stâng. Apoi le parcurgem o dată: dacă intervalul curent începe înainte de sfârșitul celui în construcție (sau chiar acolo), îl lipim, prelungind sfârșitul; altfel închidem intervalul construit și începem altul. Programul afișează intervalele reuniunii, de la stânga la dreapta.

Descrierea în engleză

pair<int, int> groups two values (first, second) and compares lexicographically: first by first, then by second. So sort on an array of pairs orders the intervals by their left end. Then we walk them once: if the current interval starts before the end of the one being built (or exactly there), we merge it, extending the end; otherwise we close the interval being built and start a new one. The program prints the intervals of the union, from left to right.

Complexitate
O(n log n)
Clasa
Clasa a XII-a (Grade 12)

Exemple

Exemplul 1

Intrare

5
1 3
8 10
2 6
15 18
10 12

Ieșire așteptată

1 6
8 12
15 18

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

pair-reuniunea-intervalelor.cpp
/*
 * Titlu: pair — reuniunea intervalelor
 * Clasa: 12
 * Capitol: Structuri de date și STL
 * Descriere: pair<int, int> grupează două valori (first, second) și se compară
 *            lexicografic: întâi după first, apoi după second. Așadar sort pe un
 *            vector de perechi ordonează intervalele după capătul stâng. Apoi le
 *            parcurgem o dată: dacă intervalul curent începe înainte de sfârșitul
 *            celui în construcție (sau chiar acolo), îl lipim, prelungind
 *            sfârșitul; altfel închidem intervalul construit și începem altul.
 *            Programul afișează intervalele reuniunii, de la stânga la dreapta.
 * Complexitate: O(n log n)
 *
 * Exemplu
 * Intrare:
 * 5
 * 1 3
 * 8 10
 * 2 6
 * 15 18
 * 10 12
 * Ieșire:
 * 1 6
 * 8 12
 * 15 18
 */
#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<pair<int, int>> v(n);
    for (int i = 0; i < n; i++)
        cin >> v[i].first >> v[i].second;
    sort(v.begin(), v.end());

    vector<pair<int, int>> reuniune;
    pair<int, int> curent = v[0];
    for (int i = 1; i < n; i++)
    {
        if (v[i].first <= curent.second)
            curent.second = max(curent.second, v[i].second);
        else
        {
            reuniune.push_back(curent);
            curent = v[i];
        }
    }
    reuniune.push_back(curent);
    for (auto &p : reuniune)
        cout << p.first << ' ' << p.second << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.