74762024-01-09 10:00:45AblablablaA lehető legkevesebb átszállás (50 pont)cpp14Accepted 50/5016ms9472 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

struct segTree{
    int meret = 1;
    vector<pii> fa;

    void letrehoz(int n){
        while(meret < n){
            meret *= 2;
        }

        fa.assign(2 * meret - 1, {0, 0});
        for(int i = meret - 1; i < meret - 1 + n; i++){
            fa[i].first = i - meret + 1;
        }
    }

    pii keres(int a, int b, int ind, int cel){
        if(a == b && a == cel){
            return fa[ind];
        }

        int k = (a + b) / 2;
        if(cel <= k){
            pii kovi = keres(a, k, 2 * ind + 1, cel);
            if(fa[ind].first < kovi.first){
                return kovi;
            } else{
                return fa[ind];
            }
        } else{
            pii kovi = keres(k + 1, b, 2 * ind + 2, cel);
            if(fa[ind].first < kovi.first){
                return kovi;
            } else{
                return fa[ind];
            }
        }
    }

    void valtoztat(int a, int b, int ind, int kezd, int veg, int uj){
        if(veg < a || b < kezd){
            return;
        } else if(kezd <= a && b <= veg){
            if(fa[ind].first < veg){
                fa[ind] = {veg, uj};
            }
            return;
        }

        int k = (a + b) / 2;

        valtoztat(a, k, 2 * ind + 1, kezd, veg, uj);
        valtoztat(k + 1, b, 2 * ind + 2, kezd, veg, uj);
        return;
    }
};

int main()
{
    int n, m;
    cin >> m >> n;

    vector<pii> eleri(n);
    segTree fa;
    fa.letrehoz(n);

    for(int i = 0; i < m; i++){
        int a, b;
        cin >> a >> b;
        a--; b--;

        fa.valtoztat(0, fa.meret - 1, 0, a, b, i);
    }

    int akt = 0;
    vector<int> vonalak;
    while(akt < n - 1){
        pii kovi = fa.keres(0, fa.meret - 1, 0, akt);
        if(akt == kovi.first){
            cout << "-1\n";
            return 0;
        }

        vonalak.push_back(kovi.second);
        akt = kovi.first;
    }

    cout << vonalak.size() - 1 << "\n";
    for(int x : vonalak){
        cout << x + 1 << " ";
    }
    cout << "\n";
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/03ms1808 KiB
2Accepted0/014ms7512 KiB
3Accepted1/13ms2216 KiB
4Accepted1/13ms2460 KiB
5Accepted2/23ms2512 KiB
6Accepted2/23ms2540 KiB
7Accepted2/24ms2792 KiB
8Accepted2/24ms3104 KiB
9Accepted2/24ms3152 KiB
10Accepted2/26ms3556 KiB
11Accepted2/28ms5480 KiB
12Accepted2/28ms5776 KiB
13Accepted2/24ms4484 KiB
14Accepted2/26ms5648 KiB
15Accepted2/27ms6076 KiB
16Accepted2/28ms6200 KiB
17Accepted2/212ms8620 KiB
18Accepted2/213ms8948 KiB
19Accepted2/214ms8856 KiB
20Accepted2/214ms8984 KiB
21Accepted2/214ms8980 KiB
22Accepted2/214ms8984 KiB
23Accepted2/214ms8596 KiB
24Accepted2/214ms8676 KiB
25Accepted2/214ms9044 KiB
26Accepted2/214ms9068 KiB
27Accepted2/216ms9256 KiB
28Accepted2/214ms9472 KiB