样例错误 但是 AC 求助
查看原帖
样例错误 但是 AC 求助
704275
无名之雾楼主2024/8/9 14:59
#include<bits/stdc++.h>
using namespace std;
#define ui unsigned int
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
inline void write(int x){
    if(x==0){putchar('0');return;}
	int len=0,k1=x,c[10005];
	if(k1<0)k1=-k1,putchar('-');
	while(k1)c[len++]=k1%10+'0',k1/=10;
	while(len--)putchar(c[len]);
}
const int N=5e5+5;
ui s;
inline ui get(ui x){
	x^=x<<13;
	x^=x>>17;
	x^=x<<5;
	return s=x; 
}
int fa[N],siz[N],dep[N],top[N],h[N],id[N],dfn[N],sum,rt;
vector<int>edge[N];
void dfs1(int x){
	siz[x]=1;
	for(int i=0;i<edge[x].size();i++){
		dep[edge[x][i]]=dep[x]+1;
		dfs1(edge[x][i]);
		siz[x]+=siz[edge[x][i]];
		if(siz[h[x]]<siz[edge[x][i]])h[x]=edge[x][i];
	} 
}
void dfs2(int x){
	dfn[x]=++sum,id[sum]=x,top[h[x]]=top[x];
	if(h[x])dfs2(h[x]);
	for(int i=0;i<edge[x].size();i++){
		if(edge[x][i]!=h[x]){
			top[edge[x][i]]=edge[x][i];
			dfs2(edge[x][i]);
		}
	}
}
int jump(int x,int k){
	while(k>=dfn[x]-dfn[top[x]]+1&&x!=rt){
		k-=(dfn[x]-dfn[top[x]]+1);
		x=fa[top[x]];
	}
	return id[dfn[x]-k];
}
signed main(){
	int n=read(),m=read();cin>>s;
	for(int i=1;i<=n;i++){
		fa[i]=read();
		if(fa[i]==0)rt=i;
		edge[fa[i]].push_back(i); 
	}
	dep[rt]=1,top[rt]=rt;
	dfs1(rt),dfs2(rt);
	long long ans=0;int lstans=0;
	for(int i=1;i<=m;i++){
		int x=(get(s)^lstans)%n+1;
		int k=(get(s)^lstans)%dep[x];
		lstans=jump(x,k);
		//cout<<get(s)<<" "<<dep[x]<<" "<<x<<" "<<k<<" "<<lstans<<"\n";
		ans^=(long long)i*lstans;
	}
	cout<<ans;
	return 0;
}

对于样例,我的代码会输出 2 ?

2024/8/9 14:59
加载中...