#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N_ (3*N)
#define N 900005
#define M_ 99999990
int xx,n,q,rt,ii,head[N_],vv[M_],ww[M_],nxt[M_],jj,dp1[N_],dp2[N_],tt[N_+N_],*dp,dp3[N_];
void pul(int i){ tt[i]=tt[i*2+(dp[tt[i*2+1]]<dp[tt[i*2]])]; }
void fix(int i){ for(i+=ii;i/=2;)pul(i); }
void lnk(int v,int u,int w) {
int i=++jj;
ww[i]=w;
vv[i]=v;
nxt[i]=head[u];
head[u]=i;
}
void lnk2(int v,int l,int r,int x,int y,int k) {
if(r<x||y<l)return;
if(x<=l&&r<=y){
lnk(k,v,0);
return;
}
int m=(l+r)/2,vr=v+2*(m-l+1);
lnk2(v+1,l,m,x,y,k);
lnk2(vr,m+1,r,x,y,k);
}
void build(int v,int l,int r){
ii=v+1;
if(l==r){
lnk(v,l,0);
return;
}
int m=(l+r)/2,vr=v+2*(m-l+1);
build(v+1,l,m);
build(vr,m+1,r);
lnk(v,vr,0);
lnk(v,v+1,0);
}
void bfs(int src){
static int qu[N_+N_],hd,tl;
hd=tl=N_; qu[tl]=src;++hd;
while(hd-tl){
int u=qu[tl++];
for(int j=head[u];j;j=nxt[j]){
if(dp[vv[j]]>dp[u]+ww[j]){
dp[vv[j]]=dp[u]+ww[j];
if(ww[j]) qu[hd++]=vv[j];
else qu[--tl]=vv[j];
}
}
}
}
int main()
{
scanf("%d",&n);
build(n,0,n-1);
for(int ll,rr,i=0;i<n;++i){
scanf("%d%d",&ll,&rr);
int br=ii++;
lnk(i,br,1);
lnk2(n,0,n-1,ll-1,rr-1,br);
}
dp=dp1;
for(int i=0;i<ii;++i)dp[i]=i?1e9:0;
bfs(0);
dp=dp2;
for(int i=0;i<ii;++i)dp[i]=i==n-1?0:1e9;
bfs(n-1);
dp=dp3;
for(int i=0;i<ii;++i)dp[i]=dp1[i]+dp2[i],tt[ii+i]=i;
dp[ii]=1e9+1;
for(int i=ii;--i;)pul(i);
for(int it=0;it<ii;++it){
int u=tt[1];
tt[ii+u]=ii;
fix(u);
for(int j=head[u];j;j=nxt[j]){
if(tt[vv[j]+ii]==vv[j]&&dp[u]+ww[j]<dp[vv[j]]){
dp[vv[j]]=dp[u]+ww[j];
fix(vv[j]);
}
}
}
scanf("%d",&q);
while(q--)scanf("%d",&xx),--xx,printf("%d\n",dp3[xx]>=1e9?-1:dp3[xx]);
}
컴파일 시 표준 에러 (stderr) 메시지
passport.c: In function 'main':
passport.c:62:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
62 | scanf("%d",&n);
| ^~~~~~~~~~~~~~
passport.c:66:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
66 | scanf("%d%d",&ll,&rr);
| ^~~~~~~~~~~~~~~~~~~~~
passport.c:95:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
95 | scanf("%d",&q);
| ^~~~~~~~~~~~~~
passport.c:96:15: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
96 | while(q--)scanf("%d",&xx),--xx,printf("%d\n",dp3[xx]>=1e9?-1:dp3[xx]);
| ^~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |