社区讨论

WA 50pts求助

P5903【模板】树上 K 级祖先参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mjmp96oo
此快照首次捕获于
2025/12/26 17:59
2 个月前
此快照最后确认于
2025/12/28 10:20
2 个月前
查看原帖
长链剖分,找不出问题
CPP
#include<bits/stdc++.h>
#define ll long long
#define ui unsigned int
using namespace std;

ui s;

inline ui get(ui x) {
	x ^= x << 13;
	x ^= x >> 17;
	x ^= x << 5;
	return s = x; 
}
ll n,q,realans=0,f[500005][25],root,dep[500005],d[500005],lson[500005],son[500005],top[500005],ans[5000005];
vector<ll> vt[500005],fa[500005],sn[500005];
ll lg[500005];
void dfs(ll x)
{
	dep[x]=d[x]=d[f[x][0]]+1;
	for(ll i=0;i<vt[x].size();i++)
	{
		ll v=vt[x][i];
		f[v][0]=x;
		for(ll j=1;f[v][j-1];j++)
		{
			f[v][j]=f[f[v][j-1]][j-1];
		}
		dfs(v);
		if(dep[v]>dep[x])
		{
			dep[x]=dep[v];
			son[x]=v;
		}
	}
}
void dfs2(ll x,ll tp)
{
	top[x]=tp;
	if(x==tp)
	{
		ll now=x;
		for(ll i=0;i<=dep[x]-d[x];i++)
		{
			fa[x].push_back(now);
			now=fa[now][0];
		}
		now=x;
		for(ll i=0;i<=dep[x]-d[x];i++)
		{
			sn[x].push_back(now);
			now=son[now];
		}
	}
	if(son[x]) dfs2(son[x],tp);
	for(ll i=0;i<vt[x].size();i++)
	{
		ll v=vt[x][i];
		if(v!=son[x]) dfs2(v,v);
	}
}
ll getans(ll x,ll k)
{
	if(k==0) return x;
	//cout<<k<<" "<<lg[k]<<" "<<x<<" "<<top[x]<<endl;
	x=f[x][lg[k]];
	k-=(1<<lg[k]);
	k-=(d[x]-d[top[x]]);
	x=top[x];
	//cout<<k<<endl;
	if(k>=0) 
    {
       //cout<<fa[x][k]<<endl;
        return fa[x][k];
    }
	k=-k;
    //cout<<x<<" "<<k<<endl;
    //cout<<sn[x][k]<<endl;
	return sn[x][k];
}
int main()
{
	cin>>n>>q>>s;
	lg[0]=-1;
	for(ll i=1;i<=n;i++)
	{
		if(i==1) lg[i]=0;
		else lg[i]=lg[(i>>1)]+1;
	}
	for(ll i=1;i<=n;i++)
	{
		cin>>f[i][0];
		vt[f[i][0]].push_back(i);
	}
	root=vt[0][0];
	dfs(root);
	dfs2(root,root);
	for(ll i=1;i<=q;i++)
	{
		ll x=(get(s)^ans[i-1])%n+1;
		ll k=(get(s)^ans[i-1])%d[x];
		//cout<<x<<" "<<k<<endl;
		ans[i]=getans(x,k);
		realans=realans^(i*ans[i]);
	}
	cout<<realans;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...