Submission #748027

#TimeUsernameProblemLanguageResultExecution timeMemory
748027WongChun1234Passport (JOI23_passport)C++14
100 / 100
893 ms166116 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=200050;
int n,q,x,l[N],r[N],dist[3][N<<2],final[3][N<<2],rrl[N],mx;
vector<pair<int,int>> adj[N<<2],radj[N<<2];
priority_queue<pair<int,int>> pq;
void pre(int id,int l,int r){
    mx=max(id,mx);
    //cout<<id<<" "<<l<<" "<<r<<"\n";
    if (l==r){
        rrl[l]=id;
        return;
    }
    int m=(l+r)/2;
    pre(id*2,l,m);
    pre(id*2+1,m+1,r);
    adj[id].push_back({id*2,0});
    adj[id].push_back({id*2+1,0});
    radj[id*2].push_back({id,0});
    radj[id*2+1].push_back({id,0});
}
void build(int id,int l,int r,int ql,int qr,int rt,int dist){
    if (l>qr||r<ql) return;
    if (ql<=l&&qr>=r){
        //cout<<rt<<"<->"<<id<<"\n";
        adj[rt].push_back({id,dist});
        radj[id].push_back({rt,dist});
        return;
    }
    int m=(l+r)/2;
    build(id*2,l,m,ql,qr,rt,dist);
    build(id*2+1,m+1,r,ql,qr,rt,dist);
}
void rdij(int id,int st){
    while (pq.size()) pq.pop();
    for (int i=0;i<N*4;i++) dist[id][i]=1e8,final[id][i]=0;
    dist[id][st]=0;
    pq.push({0,st});
    while (pq.size()){
        int cnde=pq.top().second;
        pq.pop();
        if (final[id][cnde]) continue;
        final[id][cnde]=1;
        //cout<<cnde<<": "<<dist[id][cnde]<<"\n";
        for (auto i:radj[cnde]){
            if (dist[id][i.first]>dist[id][cnde]+i.second){
                dist[id][i.first]=dist[id][cnde]+i.second;
                //cout<<cnde<<"->"<<i.first<<"\n";
                pq.push({-dist[id][i.first],i.first});
            }
        }
    }
}
int main(){
    cin.tie(0)->sync_with_stdio(0);
    cin>>n;
    for (int i=1;i<=n;i++) cin>>l[i]>>r[i];
    pre(1,1,n);
    for (int i=1;i<=n;i++){
        build(1,1,n,l[i],r[i],rrl[i],1);
        if (l[i]==1) radj[mx+1].push_back({rrl[i],0});
        if (r[i]==n) radj[mx+2].push_back({rrl[i],0});
    }
    rdij(0,mx+1);
    rdij(1,mx+2);
    for (int i=1;i<=n;i++){
        //cout<<i<<": "<<dist[0][rrl[i]]<<" "<<dist[1][rrl[i]]<<"\n";
        radj[0].push_back({rrl[i],dist[0][rrl[i]]+dist[1][rrl[i]]});
        adj[rrl[i]].push_back({0,dist[0][rrl[i]]+dist[1][rrl[i]]});
    }
    rdij(2,0);
    cin>>q;
    while (q--){
        cin>>x;
        int tmp=dist[2][rrl[x]];
        cout<<(tmp>=1e8?-1:tmp+1)<<"\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...