Submission #1322815

#TimeUsernameProblemLanguageResultExecution timeMemory
1322815wangzhiyi33Passport (JOI23_passport)C++20
100 / 100
1231 ms76356 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back

const int maxn=2e5;
int n,l[maxn+2],r[maxn+2];
bool vis[maxn+2];

struct seg{
    int l,r;
    seg *lf,*rg;
    vector<int>isi;

    void reset(){
        isi.clear();
        if(l==r)return;
        lf->reset(),rg->reset();
    }

    void build(int x,int y){
        l=x,r=y;
        if(l==r)return;
        int mid=(l+r)/2;
        lf=new seg(),rg=new seg();
        lf->build(l,mid),rg->build(mid+1,r);
    }

    void update(int posl,int posr,int apa){
        if(l>posr || r<posl)return;
        if(l>=posl && r<=posr){
            isi.pb(apa);
            return;
        }
        lf->update(posl,posr,apa); rg->update(posl,posr,apa);
    }

    vector<int> query(int pos){
        vector<int>baru;
        for(auto y : isi){
            if(vis[y])continue;
            baru.pb(y);
            vis[y]=true;
        }
        isi.clear();
        
        if(l==r)return baru;
        int mid=(l+r)/2;
        vector<int>a;
        if(pos<=mid)a=lf->query(pos);
        else a=rg->query(pos);

        for(auto y : a){
            baru.pb(y);
        }

        return baru;
    }
};

int dist[maxn+2][3];
seg cek;

void solve(int ty){
    cek.reset();
    for(int q=1;q<=n;++q){
        dist[q][ty]=1e18;
        vis[q]=false;
    }

    queue<int>qu;
    if(ty==0){
        qu.push(1);
        vis[1]=true;
        dist[1][0]=0;
    }
    else{
        qu.push(n);
        vis[n]=true;
        dist[n][1]=0;
    }

    for(int q=1;q<=n;q++){
        cek.update(l[q],r[q],q);
    }

    while(qu.size()){
        int idx=qu.front(); qu.pop();
        vector<int>nxt=cek.query(idx);

        for(auto x : nxt){
            if(dist[x][ty]>dist[idx][ty]+1){
                dist[x][ty]=dist[idx][ty]+1;
                qu.push(x);
                vis[x]=true;
            }
        }
    }
}

signed main(){
    cin>>n;
    for(int q=1;q<=n;q++){
        cin>>l[q]>>r[q];
    }
    cek.build(1,n);
    solve(0),solve(1);

    priority_queue<ii,vector<ii>,greater<ii> >pq;

    for(int q=1;q<=n;q++){
        if(q==1){
            dist[q][2]=dist[q][1];
        }
        else if(q==n){
            dist[q][2]=dist[q][0];
        }
        else{
            dist[q][2]=dist[q][0]+dist[q][1]-1;
        }
        if(dist[q][2]<1e18){
            pq.push({dist[q][2],q});
        }
    }

    // for(int q=1;q<=n;q++){
    //     cout<<dist[q][0]<<" k "<<dist[q][1]<<endl;
    // }

    cek.reset();
    for(int q=1;q<=n;q++)vis[q]=false;
    for(int q=1;q<=n;q++)cek.update(l[q],r[q],q);
    while(pq.size()){
        auto [jrk,idx]=pq.top(); pq.pop();
        if(dist[idx][2]!=jrk)continue;

        vector<int>nxt=cek.query(idx);
        for(auto x : nxt){
            if(dist[x][2]>jrk+1){
                dist[x][2]=jrk+1;
                pq.push({dist[x][2],x});
            }
        }
    }

    int hmm; cin>>hmm;
    while(hmm--){
        int idx; cin>>idx;
        if(dist[idx][2]>=1e18){
            cout<<-1<<endl;
        }
        else{
            cout<<dist[idx][2]<<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...