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...