求助RE
查看原帖
求助RE
147884
sgbzlzy楼主2023/3/14 20:58

求助全是RE,找不出访问不了的地方

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=500010;

inline int read(){
	int s=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+int(ch-'0');ch=getchar();}
	return s*f;
}

#define ui unsigned int
ui s;

inline ui get(ui x) {
	x ^= x << 13;
	x ^= x >> 17;
	x ^= x << 5;
	return s = x; 
}

long long n,q,root,answer,outs;

int lg[maxn],cf[50];
int ycl(){
	lg[0]=-1;cf[0]=1;
	for(int i=1;i<=n;i++)lg[i]=lg[i/2]+1;
	for(int i=1;i<=30;i++)cf[i]=cf[i-1]*2;
}

struct node{
	int next,to;
}tu[maxn<<2];
int num,have[maxn];

void adds(int from,int to){
	num++;
	tu[num].to=to;
	tu[num].next=have[from];
	have[from]=num;
}

int fa[maxn][32],dep[maxn],son[maxn],len[maxn];
int cnt,to[maxn],back[maxn];

void dfs1(int now,int fas){
	fa[now][0]=fas;dep[now]=dep[fas]+1;len[now]=1;
	for(int i=1;;i++){
		if(!fa[fa[now][i-1]][i-1])break;
		fa[now][i]=fa[fa[now][i-1]][i-1];
	}
	for(int i=have[now];i;i=tu[i].next)
		if(tu[i].to!=fas){
			dfs1(tu[i].to,now);
			if(len[tu[i].to]+1>len[now])
				len[now]=len[tu[i].to]+1,son[now]=tu[i].to;
		}
}

void dfs2(int now){
	to[now]=++cnt;back[cnt]=now;
	if(son[now])dfs2(son[now]);
	for(int i=have[now];i;i=tu[i].next)
		if(tu[i].to!=fa[now][0]&&tu[i].to!=son[now])
			dfs2(tu[i].to);
}

int main(){
	int x,k,fas;
	n=read();q=read();cin>>s;ycl();
	for(int i=1;i<=n;i++){
		x=read();
		if(x)adds(x,i),adds(i,x);
		else root=i;
	}
	dfs1(root,0);dfs2(root);
	for(int i=1;i<=q;i++){
		x=((get(s)^answer)%n)+1;k=(get(s)^answer)%dep[x];
		if(k!=0){
			fas=fa[x][lg[k]];k-=cf[lg[k]];
			answer=back[to[fas]-k];
		}
		else answer=x;
		outs^=answer*i;
	}
	cout<<outs;
}
2023/3/14 20:58
加载中...