长链剖分 9RE+1WA求调
查看原帖
长链剖分 9RE+1WA求调
361141
_JF_殉情楼主2024/4/20 11:46
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
vector<int> g[N],g1[N],G[N];
bool vis[N];
int dep[N],hvs[N],Depmax[N],fa[N][21],top[N],Log[N],n,q;
unsigned int s;
inline unsigned int get(unsigned int x) {
	x ^= x << 13;
	x ^= x >> 17;
	x ^= x << 5;
	return s = x; 
}
void dfs(int u,int fath){
	dep[u]=dep[fath]+1,fa[u][0]=fath,hvs[u]=-1;
	for(int i=1;(1<<i)<=dep[u];i++)	fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==fath)	continue;
		dfs(v,u);	Depmax[u]=max(Depmax[u],Depmax[v]+1); 
		if(hvs[u]==-1||Depmax[v]>Depmax[hvs[u]])	hvs[u]=v;
	}
}
void rdfs(int u,int fath,int T){
	top[u]=T;
	if(hvs[u]==-1)	return ;
	rdfs(hvs[u],u,T);
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==fath||v==hvs[u])	continue;
		rdfs(v,u,v),vis[v]=true;
	}
}
void init(){
	for(int i=2;i<=n;i++)	Log[i]=Log[i>>1]+1;
	for(int i=1;i<=n;i++){
		if(vis[i]==false)	continue;
		int now=i,now1=i;
		for(int j=1;j<=Depmax[i];j++)	g[i].push_back(fa[now][0]),g1[i].push_back(hvs[now1]),now=fa[now][0],now1=hvs[now1];	
	}
}
int main(){
//	freopen("P5903_1.in","r",stdin);
//	freopen("ans.out","w",stdout);
	cin>>n>>q>>s;
	int root;
	for(int i=1,x;i<=n;i++){
		cin>>x; 
		if(x==0)	root=i;
		else	G[i].push_back(x),G[x].push_back(i);	
	}
	dfs(root,0),vis[root]=true,rdfs(root,0,root),init();
	int lans=0,ans=0;
	for(int i=1;i<=q;i++){
		int x=(get(s)^lans)%n+1;
		int k=(get(s)^lans)%dep[x];
		if(dep[x]<k){
			ans^=0,lans=0; continue;
		}
		int pre=k-(1<<(Log[k])),now=pre-(dep[fa[x][Log[k]]]-dep[top[fa[x][Log[k]]]]);
		if(now>0)	ans^=(i*g[top[fa[x][Log[k]]]][now-1]),lans=(g[top[fa[x][Log[k]]]][now-1]);	
		else if(now==0)	ans^=(i*top[fa[x][Log[k]]]),lans=(top[fa[x][Log[k]]]);
		else	ans^=(i*g1[top[fa[x][Log[k]]]][-now-1]),lans=(g1[top[fa[x][Log[k]]]][-now-1]);
	}
	cout<<ans<<endl;
}
2024/4/20 11:46
加载中...