Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
35198 baka24 【S】T3 C++ 解答错误 64 62 MS 83412 KB 3451 2024-11-28 18:54:04

Tests(21/23):


#include<bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v 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=2000010,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,k,L,R,a[MAXN]; int vis[MAXN],cnt,p[MAXN]; int dfs(int u){ if(vis[u])return u; vis[u]=1; for(inx(u)){ int tmp=dfs(v); if(tmp){ vis[u]=-1; p[++cnt]=u; return tmp==u?0:tmp; } } return 0; } int bel[MAXN],lp[MAXN],dep[MAXN],c[MAXN],s[MAXN],dfn[MAXN],ed[MAXN],tot,tk[MAXN]; vector<int>f[MAXN]; int dfs2(int u,int bl){ vis[u]=-1; dfn[u]=++tot; tk[u]=k; bel[u]=bl; int res=1; for(inx(u))if(vis[v]!=-1)dep[v]=dep[u]+1,res+=dfs2(v,bl); ed[u]=tot; return res; } int fa[MAXN],as[MAXN]; int fid(int x){return fa[x]==x?x:fa[x]=fid(fa[x]);} void mrge(int x,int y){int u=fid(x),v=fid(y);if(u!=v)fa[u]=v;} void init(int x){for(int i=1;i<=x+1;i++)fa[i]=i;} void upd(int l,int r,int x){ // if(k==16&&x<=100)cout<<l<<" "<<r<<" "<<x<<" "<<s[k]<<" "<<c[k]<<" "<<((l-s[k])/c[k])*c[k]<<endl; if(l>s[k])r-=((l-s[k]-1)/c[k]+1)*c[k],l-=((l-s[k]-1)/c[k]+1)*c[k]; r=min(r,s[k]+c[k]); int now=fid(l); while(now<=r){ as[now]=x; mrge(now,now+1); now=fid(now); } } int F[MAXN]; deque<int>Q; void slv(){ n=read(),L=read(),R=read(); for(int i=1;i<=n;i++)a[i]=read(),add_side(a[i],i);//,cout<<a[i]<<" "<<i<<endl; memset(F,-1,sizeof(F)); F[0]=0; Q.push_back(0); for(int i=1;i<=n;i++){ while(!Q.empty()&&Q.front()<i-L)Q.pop_front(); if(i-R>=0&&F[i-R]!=-1){ while(!Q.empty()&&F[Q.front()]>F[i-R])Q.pop_back(); Q.push_back(i-R); } if(!Q.empty())F[i]=F[Q.back()]+1; } for(int i=1;i<=n;i++)if(!vis[i]){k++; cnt=tot=0; dfs(i); c[k]=cnt; for(int j=1;j<=cnt;j++)s[k]+=dfs2(p[j],j);//,cout<<p[j]<<" ";cout<<endl; init(s[k]+c[k]); for(int j=s[k]+c[k];j>=1;j--)as[j]=inf; for(int j=1;j<=s[k];j++)upd(j*L,j*R,j); for(int j=s[k];j>=1;j--)as[j]=min(as[j],as[j+c[k]]); f[k].pb(0); for(int j=1;j<=s[k]+c[k];j++)f[k].pb(as[j]);//,cout<<as[j]<<" ";cout<<endl; // if(k==1)for(int j=1;j<=s[k]+c[k];j++)if(j>=22600&&j<=25000)cout<<j<<"_"<<as[j]<<" ";cout<<endl; } // return; // for(int i=1;i<=n;i++)cout<<tk[i]<<" ";cout<<endl; // for(int i=1;i<=n;i++)cout<<bel[i]<<" ";cout<<endl; // for(int i=1;i<=n;i++)cout<<dfn[i]<<" ";cout<<endl; q=read(); while(q--){ int x=read(),y=read(); if(tk[x]!=tk[y])printf("-1\n"); else if(dep[y]){ // cout<<dep[x]-dep[y]<<" "<<x<<" "<<y<<" "<<F[dep[x]-dep[y]]<<endl; if(bel[x]==bel[y]&&dfn[x]>=dfn[y]&&dfn[x]<=ed[y])printf("%lld\n",F[dep[x]-dep[y]]); else printf("-1\n"); } else{ int tmp=(bel[y]-bel[x]+c[tk[x]])%c[tk[x]]; printf("%lld\n",f[tk[x]][tmp+dep[x]]>=inf?-1ll:f[tk[x]][tmp+dep[x]]); } } } signed main(){ slv(); return 0; }


测评信息: