Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35144 | baka24 | 【S】T3 | C++ | 解答错误 | 16 | 215 MS | 6032 KB | 2582 | 2024-11-28 13:01:13 |
#include<bits/stdc++.h> using namespace std; #define ll long long int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=200010,MAXM=510,N=22,inf=1e9; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT=1;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;} int n,q,L,R,a[MAXN],f[MAXM][MAXM]; void slv0(){ memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++){ int now=a[i]; for(int j=1;j<=R;j++){ if(j>=L)f[i][now]=1; now=a[now]; } } for(int i=1;i<=n;i++)f[i][i]=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)f[j][k]=min(f[j][k],f[j][i]+f[i][k]); q=read(); while(q--){ int x=read(),y=read(); printf("%d\n",f[x][y]>=inf?-1:f[x][y]); } } #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int vis[MAXN],bel[MAXN],p[MAXN],bg[MAXN],ed[MAXN],cnt,tim; int dfs1(int u){ if(vis[u]==tim)return u; vis[u]=tim; int res=-1; for(inx(u))if((!vis[v]||vis[v]==tim)){ int tmp=dfs1(v); if(tmp!=-1){ vis[u]=1; p[++cnt]=u; res=tmp; } } return res==u?-1:res; } int dep[MAXN],fa[MAXN][N+3]; bool chk(int x,int y){ for(int i=N;~i;i--)if(dep[fa[x][i]]>=dep[y])x=fa[x][i]; return x==y; } void dfs2(int u,int lst,int bl){ vis[u]=1; f[u][0]=lst; bel[u]=bl; for(inx(u))if(vis[v]!=1)dep[v]=dep[u]+1,dfs2(v,u,bl); } void slv1(){ for(int i=1;i<=n;i++)add_side(a[i],i); tim=1; for(int i=1;i<=n;i++)if(!vis[i]){tim++; int tmp=cnt; int ttmp=dfs1(i); for(int j=tmp+1;j<=cnt;j++)bg[j]=tmp+1,ed[j]=cnt-tmp; } for(int i=1;i<=cnt;i++)dfs2(p[i],p[i],i); for(int i=1;i<=N;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1]; q=read(); while(q--){ int x=read(),y=read(); if(bel[x]==bel[y]){ if(chk(x,y))printf("%lld\n",dep[y]-dep[x]); else printf("-1\n"); } else if(p[bel[y]]==y){ if(bg[bel[x]]==bg[bel[y]])printf("%lld\n",dep[x]+dep[y]+(bel[y]-bel[x]+ed[x])); else printf("-1\n"); } else printf("-1\n"); } } void slv2(){ } void slv(){ n=read(),L=read(),R=read(); for(int i=1;i<=n;i++)a[i]=read(); if(n<=500)slv0(); else if(L==R&&L==1)slv1(); } signed main(){ slv(); return 0; }