제출 #1344202

#제출 시각아이디문제언어결과실행 시간메모리
1344202nikaa123Event Hopping (BOI22_events)C++20
20 / 100
170 ms27240 KiB
#include<bits/stdc++.h>
using namespace std;

signed main() {
    ios :: sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    #define endl "\n"

    int n,q;
    cin >> n >> q;
    vector <int> s(n+1,-1),e(n+1,-1);
    for (int i = 1; i <= n; i++) {
        cin >> s[i] >> e[i];
    }

    vector <array<int,3>> r;
    for (int i = 1; i <= n; i++) {
        r.push_back({s[i],e[i],i});
    }
    sort(r.begin(),r.end());
    vector <int> id(n+1,0);
    for (int i = 0; i < n; i++) {
        id[r[i][2]] = i;
    }
    vector <vector<int>> mx(n+1,vector<int>(20,-1));
    for (int i = 0; i < n; i++) {
        mx[i][0] = i;
    }
    auto merge = [&](int a, int b) {
        if (a == -1 && b == -1) return -1;
        if (b == -1) return a;
        if (a == -1) return b;
        if (r[a][1] >= r[b][1]) return a;
        return b;
    };
    for (int i = 1; i <= 19; i++) {
        for (int j = 0; j + (1<<i)-1 < n; j++) {
            // cout << i << " " << j << endl;
            mx[j][i] = merge(mx[j][i-1],mx[j+(1<<(i-1))][i-1]);
        }
    }

    auto getmax = [&](int l, int r) {
        int lg = log2((r-l+1));
        return merge(mx[l][lg],mx[r-(1<<lg)+1][lg]);
    };
    // for (int i = 1; i <= n; i++) {
    //     cout << i << " ---> " << id[i] << endl;
    //     cout << i-1 << " " << mx[i-1][1] << endl;
    // }
    // cout << getmax(0,2) << endl;




    vector <vector<int>> up(n+1,vector<int>(20,-1));
    for (int i = 0; i < n; i++) {
        int l = 0; int tr = n-1;
        int i1 = -1;
        while (l <= tr) {
            int mid = (l+tr)/2;
            // cout << mid << endl;
            if (r[mid][0] <= r[i][1]) {
                i1 = mid;
                l = mid + 1;
            } else {
                tr = mid - 1;
            }
        }
        // cout << i << " ---> " << i1 << endl;
        
        if (i1 != i) i1 = getmax(i,i1); else i1 = -1;
        up[i][0] = i1;
    }
    for (int i = 1; i <= 19; i++) {
        for (int j = 0; j < n; j++) {
            if (up[j][i-1] == -1) continue;
            up[j][i] = up[up[j][i-1]][i-1];
        }
    }

    // for (int i = 0; i <= 2; i++) {
    //     for (int j = 0; j < n; j++) {
    //         cout << i << " " << j << " ---> " << up[j][i] << endl;
    //     }
    // }




    while (q--) {
        int S,E;
        cin >> S >> E;
        S = id[S]; E = id[E];
        // cout << S << "   " << E << endl;
        if (r[S][1] > r[E][1]) {
            cout << "impossible" << endl;
            continue;
        }
        if (S == E) {
            cout << 0 << endl;
            continue;
        }
        int cur = 0;
        if (r[E][0] <= r[S][1] && r[S][1] <= r[E][1]) {
            cout << cur+1 << endl;
            continue;
        }
        for (int i = 19; i >= 0; i--) {
            if (up[S][i] == -1) continue;
            if (r[up[S][i]][1] < r[E][0]) {
                cur += (1<<i);
                S = up[S][i];
            }
        }
        if (r[E][0] <= r[S][1] && r[S][1] <= r[E][1]) {
            cout << cur+1 << endl;
            continue;
        }
        cur++;
        S = up[S][0];

        if (r[E][0] <= r[S][1] && r[S][1] <= r[E][1]) {
            cout << cur+1 << endl;
            continue;
        }
        cout << "impossible" << endl;
    }


}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...