样例过了全 WA 求助
查看原帖
样例过了全 WA 求助
203008
山田リョウ楼主2023/4/27 11:08
// Problem: P5903 【模板】树上 k 级祖先
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5903
// Memory Limit: 500 MB
// Time Limit: 3000 ms

#include<stdio.h>
#include<vector>
typedef unsigned int ui;
ui s;inline ui get(){return s^=s<<13,s^=s>>17,s^=s<<5;}
ui f[20][500001],lg[500001],root,d[500001],h[500001],son[500001],q[500001],deg[500001],a[100001],dfn[500001],anc[500001],tp[500001],n,tot,*fa=f[0];
std::vector<ui>edge[500001];
void bfs(){
	ui fr=0,tl=0;
	for(ui i=1;i<=n;++i)if(fa[i])++deg[fa[i]];
	for(ui i=1;i<=n;++i)if(!deg[i])q[tl++]=i;
	for(;fr<tl;++fr){
		if(fa[q[fr]]){
			edge[fa[q[fr]]].push_back(q[fr]);
			if(h[fa[q[fr]]]<h[q[fr]]+1)h[fa[q[fr]]]=h[q[fr]]+1,son[fa[q[fr]]]=q[fr];
			if(!(--deg[fa[q[fr]]]))q[tl++]=fa[q[fr]];
		}else root=q[fr];
	}
}
void dfs(ui u,ui t){
	a[dfn[u]=++tot]=u,d[u]=d[fa[u]]+1;
	if(t)tp[u]=tp[fa[u]];
	else{
		tp[u]=u;
		for(int i=0,v=u;i<h[u];++i)anc[tot+i]=v=fa[v];
	}
	if(son[u])dfs(son[u],1);
	for(const auto&v:edge[u])
		if(v!=son[u])
			dfs(v,0);
}
ui query(ui u,ui k){
	u=f[lg[k]][u],k-=(1<<lg[k]);
	return d[u]-k>=d[tp[u]]?a[dfn[u]-k]:anc[dfn[tp[u]]-1+k+d[tp[u]]-d[u]];
}
int main(){
	ui q;unsigned long long res=0;
	scanf("%u%u%u",&n,&q,&s);
	for(ui i=1;i<=n;++i)scanf("%d",fa+i),lg[i]=i>1?lg[i>>1]+1:0;
	for(ui i=1;i<=lg[n];++i)
		for(ui j=1;j<=n;++j)
			f[i][j]=f[i-1][f[i-1][j]];
	bfs(),dfs(root,0);
	for(ui i=1,lst=0,u,k;i<=q;++i){
		u=(get()^lst)%n+1,k=(get()^lst)%d[u];
		res^=(unsigned long long)i*(lst=query(u,k));
	}
	printf("%llu",res);
	return 0;
}
2023/4/27 11:08
加载中...