50分TLE求调QAQ
查看原帖
50分TLE求调QAQ
1030687
coco20121120楼主2025/7/22 15:18

求调,为什么最后五个点全部TLE了QAQ。

#include<bits/stdc++.h>
using namespace std;
int root,fa[500005],son[500005],siz[500005],deep[500005],dfn[500005],id[500005],top[500005],cnt=0;
int ans[500005];
vector<int> g[500005];
void get(int u,int father){
	deep[u]=deep[father]+1,siz[u]=1,fa[u]=father;
	for(int i:g[u]){
		if(i==father) continue;
		else{
			get(i,u);
			siz[u]+=siz[i];
			if(siz[i]>siz[son[u]]) son[u]=i;
		} 
	}
}
void dfs(int u,int t){
	dfn[u]=++cnt,id[cnt]=u,top[u]=t;
	if(son[u]==0) return;
	dfs(son[u],t);
	for(int i:g[u]){
		if(i==fa[u]||i==son[u]) continue;
		else dfs(i,i);
	}
}
#define uint unsigned int
uint s;
inline uint getnum(uint x) {
	x ^= x << 13;
	x ^= x >> 17;
	x ^= x << 5;
	return s = x;
}
int findans(int x,int k){
	if(k==0) return x;
	else if(k>=deep[x]) return 0;
	while(k>=deep[x]-deep[top[x]]+1) k-=(deep[x]-deep[top[x]]+1),x=fa[top[x]];
	return id[dfn[x]-k];
} 
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,q;
	cin>>n>>q>>s;
	for(int i=1;i<=n;i++){
		int a;
		cin>>a;
		if(a!=0) g[a].push_back(i),g[i].push_back(a);
		else root=i;
	}
	get(root,0); 
	dfs(root,root);
	long long sum=0;
	for(int i=1;i<=q;i++){
		int x=(getnum(s)^ans[i-1])%n+1;
		int k=(getnum(s)^ans[i-1])%deep[x];
		ans[i]=findans(x,k);
		sum^=(ans[i]*1ll*i);
	}
	cout<<sum;
	return 0;
}
2025/7/22 15:18
加载中...