74762024-01-09 10:00:45AblablablaA lehető legkevesebb átszállás (50 pont)cpp14Elfogadva 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";
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/03ms1808 KiB
2Elfogadva0/014ms7512 KiB
3Elfogadva1/13ms2216 KiB
4Elfogadva1/13ms2460 KiB
5Elfogadva2/23ms2512 KiB
6Elfogadva2/23ms2540 KiB
7Elfogadva2/24ms2792 KiB
8Elfogadva2/24ms3104 KiB
9Elfogadva2/24ms3152 KiB
10Elfogadva2/26ms3556 KiB
11Elfogadva2/28ms5480 KiB
12Elfogadva2/28ms5776 KiB
13Elfogadva2/24ms4484 KiB
14Elfogadva2/26ms5648 KiB
15Elfogadva2/27ms6076 KiB
16Elfogadva2/28ms6200 KiB
17Elfogadva2/212ms8620 KiB
18Elfogadva2/213ms8948 KiB
19Elfogadva2/214ms8856 KiB
20Elfogadva2/214ms8984 KiB
21Elfogadva2/214ms8980 KiB
22Elfogadva2/214ms8984 KiB
23Elfogadva2/214ms8596 KiB
24Elfogadva2/214ms8676 KiB
25Elfogadva2/214ms9044 KiB
26Elfogadva2/214ms9068 KiB
27Elfogadva2/216ms9256 KiB
28Elfogadva2/214ms9472 KiB