제출 #1155728

#제출 시각아이디문제언어결과실행 시간메모리
1155728abcdxyz123Passport (JOI23_passport)C++20
100 / 100
484 ms81628 KiB
#include<bits/stdc++.h> #define maxn 200005 #define inf 1000000000 #define pi pair<int,int> #define fi first #define se second using namespace std; int n,Q; int l[maxn]; int r[maxn]; int p[maxn]; vector<pi>adj[4*maxn]; void build(int r=1,int lo=1,int hi=n) { if(lo==hi) { p[lo]=r; return; } int mid=(lo+hi)/2; build(2*r,lo,mid); build(2*r+1,mid+1,hi); adj[2*r].emplace_back(r,0); adj[2*r+1].emplace_back(r,0); } void Link(int x,int u,int v,int r=1,int lo=1,int hi=n) { if(u>hi||v<lo)return; if(u<=lo&&hi<=v) { adj[r].emplace_back(p[x],1); return; } int mid=(lo+hi)/2; Link(x,u,v,2*r,lo,mid); Link(x,u,v,2*r+1,mid+1,hi); } int ds[4*maxn]; int dt[4*maxn]; void Dijkstra(int s,int d[]) { for(int i=1;i<=4*n;i++) { d[i]=inf; } d[s]=0; deque<int>q; q.push_front(s); while(!q.empty()) { int u=q.front(); q.pop_front(); for(auto[v,w]:adj[u]) { if(d[v]==inf) { d[v]=d[u]+w; if(w)q.push_back(v); else q.push_front(v); } } } } int d[4*maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>l[i]>>r[i]; } build(); for(int i=1;i<=n;i++) { Link(i,l[i],r[i]); } Dijkstra(p[1],ds); Dijkstra(p[n],dt); for(int i=1;i<=4*n;i++) { d[i]=inf; } priority_queue<pi,vector<pi>,greater<pi>>q; for(int i=1;i<=n;i++) { if(i==1||i==n)d[p[i]]=ds[p[i]]+dt[p[i]]; else d[p[i]]=ds[p[i]]+dt[p[i]]-1; q.push({d[p[i]],p[i]}); } while(!q.empty()) { int cur=q.top().fi; int u=q.top().se; q.pop(); if(d[u]!=cur)continue; for(auto[v,w]:adj[u]) { if(d[v]>d[u]+w) { d[v]=d[u]+w; q.emplace(d[v],v); } } } cin>>Q; while(Q--) { int x; cin>>x; cout<<((d[p[x]]>=inf)?-1:d[p[x]])<<' '; } }
#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...