Submission #739031

#TimeUsernameProblemLanguageResultExecution timeMemory
739031PoonYaPatPassport (JOI23_passport)C++14
100 / 100
837 ms96648 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;

int n,pos[200001],dis[3][1<<20];
bool vis[3][1<<20],leaf[1<<20];
vector<pii> adj[1<<20];

void build(int idx, int l, int r) {
    if (l==r) {
        pos[l]=idx;
        leaf[idx]=true;
    } else {
        adj[2*idx].push_back(pii(idx,0));
        adj[2*idx+1].push_back(pii(idx,0));

        int mid=(l+r)/2;
        build(2*idx,l,mid);
        build(2*idx+1,mid+1,r);
    }
}

void add(int l, int r, int idx, int x, int y, int i) {
    if (x>r || y<l) return;
    if (x<=l && r<=y) {
        adj[idx].push_back({pos[i],1});
    } else {
        int mid=(l+r)/2;
        add(l,mid,2*idx,x,y,i);
        add(mid+1,r,2*idx+1,x,y,i);
    }
}

priority_queue<pii, vector<pii>, greater<pii>> q;

void dij(int x) {
    while (!q.empty()) {
        int node=q.top().second;
        q.pop();

        if (vis[x][node]) continue;
        vis[x][node]=true;

        for (auto s : adj[node]) {
            if (dis[x][s.first]>dis[x][node]+s.second) {
                dis[x][s.first]=dis[x][node]+s.second;
                q.push({dis[x][s.first],s.first});
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    for (int i=0; i<(1<<20); ++i) dis[0][i]=dis[1][i]=dis[2][i]=1e9;

    cin>>n;
    build(1,1,n);
    for (int i=1; i<=n; ++i) {
        int l,r; cin>>l>>r;
        add(1,n,1,l,r,i);
    }

    dis[0][pos[1]]=0;
    q.push({0,pos[1]});
    dij(0);

    dis[1][pos[n]]=0;
    q.push({0,pos[n]});
    dij(1);

    for (int i=1; i<=4*n; ++i) {
        if (i==pos[1] || i==pos[n]) dis[2][i]=dis[0][i]+dis[1][i];
        else dis[2][i]=dis[0][i]+dis[1][i]-leaf[i];
        q.push({dis[2][i],i});
    }
    dij(2);

    int q; cin>>q;
    while (q--) {
        int x; cin>>x;
        if (dis[2][pos[x]]>=1e9) cout<<-1<<"\n";
        else cout<<dis[2][pos[x]]<<"\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...