求调代码
查看原帖
求调代码
477118
Noby_Gld楼主2022/7/16 16:10

刚学长链剖分,能过样例,但全 wa。

#include<bits/stdc++.h>
#define N 500010
#define ui unsigned int
using namespace std;
struct hhh{
	int v,next;
}dl[N];
int n,q,root,tot,cnt;
long long ans;
int lg[N],dep[N],lon[N],head[N],f[N][30],son[N],top[N],id[N],up[N],down[N];
ui s;
inline ui get(ui x){
	x^=x<<13;
	x^=x>>17;
	x^=x<<5;
	return s=x; 
}
void qxx(int u,int v){
	dl[++tot].v=v;
	dl[tot].next=head[u];
	head[u]=tot;
}
void dfs(int u,int h){
	dep[u]=lon[u]=h;
	for(int i=1;i<=20;i++){
		if(h<=(1<<i)) break;
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for(int i=head[u];i;i=dl[i].next){
		int v=dl[i].v;
		dfs(v,h+1);
		lon[u]=max(lon[u],lon[v]);
		if(lon[v]>lon[son[u]]) son[u]=v;
	}
}
void dfs2(int u,int t){
	id[u]=++cnt;
	up[cnt]=t;
	down[cnt]=u;
	if(!son[u]) return;
	top[son[u]]=top[u],dfs2(son[u],f[t][0]);
	for(int i=head[u];i;i=dl[i].next){
		int v=dl[i].v;
		if(v!=son[u]) top[v]=v,dfs2(v,v); 
	}
}
int find(int x,int k){
	if(!k) return x;
	x=f[x][lg[k]],k-=(1<<lg[k]);
	k-=dep[x]-dep[top[x]],x=top[x];
	if(k<=0) x=down[id[x]-k];
	else x=up[id[x]+k];
}
int main(){
	cin>>n>>q>>s;
	lg[0]=-1;
	for(int i=1;i<=n;i++) lg[i]=lg[i/2]+1;
	for(int i=1;i<=n;i++){
		cin>>f[i][0];
		if(!f[i][0]) root=i;
		else qxx(f[i][0],i);
	}
	dfs(root,1);
	top[root]=root,dfs2(root,root);
	int last=0; 
	for(int i=1;i<=q;i++){
		int x=(get(s)^last)%n+1,k=(get(s)^last)%dep[x];
		last=find(x,k);
		ans^=(long long)last*i;
	}
	cout<<ans;
	return 0;
}
2022/7/16 16:10
加载中...