제출 #1186246

#제출 시각아이디문제언어결과실행 시간메모리
1186246qwushaEvent Hopping (BOI22_events)C++20
0 / 100
1002 ms70976 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define int long long
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
int inf = 1e15;


bool cmp(vector<int> a, vector<int> b) {
    return a[1] < b[1];
}

vector<vector<int>> g;
int curc = 0;
vector<int> col;
vector<int> par;
vector<vector<int>> ups;
vector<int> dist;


void dfs(int v, int di = 0, int p = -1) {
    col[v] = curc;
    dist[v] = di;
    par[v] = v;
    if (p != -1)
        par[v] = p;
    for (auto u : g[v]) {
        if (u != p) {
            dfs(u, di + 1,v);
        }
    }
}

int logn;

int lca(int v, int u) {
    if (dist[u] > dist[v]) {
        swap(v, u);
    }
    for (int i = logn - 1; i>= 0; i--) {
        if (dist[ups[i][v]] >= dist[u])
            v = ups[i][v];
    }
    for (int i = logn - 1; i >= 0; i--) {
        if (ups[i][v] != ups[i][u]) {
            v = ups[i][v];
            u = ups[i][u];
        }
    }
    if (v == u)
        return v;
    return par[v];
}


signed main() {
    int n, q;
    cin >> n >> q;
    col.resize(n, -1);
    par.resize(n);
    dist.resize(n);
    vector<pair<int, int>> evinit(n);
    set<int> comst;
    map<int, int> nval, inival;
    for (int i = 0; i < n; i++) {
        cin >> evinit[i].fi >> evinit[i].se;
        comst.insert(evinit[i].fi);
        comst.insert(evinit[i].se);
    }
    int cur = 0;
    for (auto el : comst) {
        nval[el] = cur;
        inival[cur] = el;
        cur++;
    }
    vector<vector<int>> eve(n, vector<int>(3));
    for (int i = 0; i < n; i++) {
        eve[i][0] = nval[evinit[i].fi];
        eve[i][1] = nval[evinit[i].se];
        eve[i][2] = i;
    }
    vector<int> nind(n);
    sort(eve.begin(), eve.end(), cmp);
    for (int i = 0; i < n; i++) {
        nind[eve[i][2]] = i;
    }
    g.resize(n);
    int p = n - 1;
    int end = eve[n - 1][0];
    vector<int> begs = {n - 1};
    for (int i = n - 2; i >= 0; i--) {
        if (eve[i][1] >= end) {
            g[i].push_back(p);
            g[p].push_back(i);
        } else {
            begs.push_back(i);
        }
        if (eve[i][0] < end) {
            p = i;
            end = eve[i][0];
        }
    }
    for (auto el : begs) {
        if (col[el] == -1) {
            dfs(el);
            curc++;
        }
    }
    logn = 1;
    int vallog = 1;
    while (vallog < n) {
        vallog *= 2;
        logn++;
    }
    logn++;
    ups.resize(logn, vector<int>(n));
    for (int i = 0; i < n; i++) {
        ups[0][i] = par[i];
    }
    for (int j = 1; j < logn; j++) {
        for (int i = 0; i < n; i++) {
            ups[j][i] = ups[j - 1][ups[j - 1][i]];
        }
    }


    for (int qw = 0; qw < q; qw++) {
        int s, e;
        cin >> s >> e;
        s--;
        e--;
        s = nind[s];
        e = nind[e];
        if (col[s] != col[e]) {
            cout << "impossible" << '\n';
        } else {
            int lc = lca(s, e);
            if (lc != e) {
                cout << "impossible" << '\n';
            } else {
                cout << dist[e] - dist[lc] + (dist[s] - dist[lc]) << '\n';
            }
        }
    }
}
#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...