Submission #1186323

#TimeUsernameProblemLanguageResultExecution timeMemory
1186323qwushaEvent Hopping (BOI22_events)C++20
10 / 100
711 ms70924 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];
}

int n;

int dijkstra(int s, int e) {
    dist.assign(n, inf);
    dist[s] = 0;
    set<pair<int, int>> st = {{0, s}};
    while(!st.empty()) {
        auto pa = *st.begin();
        st.erase(pa);
        int v = pa.se;
        int d = pa.fi;
        for(auto u : g[v]) {
            if (dist[u] > d + 1) {
                st.erase({dist[u], u});
                dist[u] = d + 1;
                st.insert({dist[u], u});
            }
        }
    }
    return dist[e];
}



signed main() {
    int  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;
    }

    if (n <= 1000 && q <= 100) {
        g.resize(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == j)
                    continue;
                if (eve[j][0] <= eve[i][1] && eve[i][1] <= eve[j][1]) {
                    g[i].push_back(j);
                }
            }
        }
        for (int qw = 0; qw < q; qw++) {
            int s, e;
            cin >> s >> e;
            s--;
            e--;
            int val = dijkstra(s, e);
            if (val == inf) {
                cout << "impossible" << '\n';
            } else {
                cout << val << '\n';
            }
        }
        return 0;
    }

    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 || (lc == s && eve[e][1] == eve[s][1])){
                cout << dist[e] - dist[lc] + (dist[s] - dist[lc]) << '\n';
            } else {
                cout << "impossible" << '\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...