社区讨论
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 条回复,欢迎继续交流。
正在加载回复...