为啥8个点RE啊,只过了1个点,另外一个WA了
查看原帖
为啥8个点RE啊,只过了1个点,另外一个WA了
502658
Ray662楼主2022/8/23 21:28
#include <bits/stdc++.h>

#define int unsigned int
#define _for(i, a, b)  for (int i = (a); i <= (b); i ++ )
#define _all(i, a, b)  for (int i = (a); i >= (b); i -- )

using namespace std;

const int N = 5e5 + 5;
const int M = 22;
//const int mod = ;
//const int inf = ;

int n, L, q, seed, root, ans, temp, cnt;
int head[N], dep[N], son[N], sz[N], UP[N][M], fa[N], htop[N], BB[N];
vector<int> up[N], down[N];
struct edge { int to, next; } e[N];

inline int get(int x)
{
	x ^= x << 13;
	x ^= x >> 17;
	x ^= x << 5;
	return seed = x;
}

inline void add(int u, int v)
{
	e[ ++ cnt] = (edge){v, head[u]};
	head[u] = cnt;
}

void dfs1(int u, int tt)
{
	dep[u] = dep[tt] + 1;
	son[u] = 0;
	UP[u][0] = tt;
	fa[u] = tt;
	_for (j, 1, L)  UP[u][j] = UP[UP[u][j - 1]][j - 1];
	for (int i = head[u]; i; i = e[i].next)  if (e[i].to != tt)
	{
		int v = e[i].to;
		dfs1(v, u);
		if (! son[u] || sz[son[u]] < sz[v])  son[u] = v;
//		else  son[u] = 0;
	}
	sz[u] = son[u] ? sz[son[u]] + 1 : 1;
}

void dfs2(int u, int tt, int top)
{
	htop[u] = top;
	if (u == top)
	{
		for (int v = u; v; v = son[v])
			down[u].push_back(v);
		for (int v = u; v && up[u].size() < down[u].size(); v = fa[v])
			up[u].push_back(v);
	}
	if (son[u])  dfs2(son[u], u, top);
	for (int i = head[u]; i; i = e[i].next)  if (e[i].to != tt && e[i].to != son[u])
		dfs2(e[i].to, u, e[i].to);
}

inline int solve(int u, int k)
{
	if (dep[u] <= k)  return 0;
	if (k == 0)  return u;
	u = UP[u][BB[k]];
	k -= 1 << BB[k];
	int d = dep[u] - k - dep[htop[u]];
	return d >= 0 ? down[htop[u]][d] : up[htop[u]][- d];
}

signed main()
{
	ios :: sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	cin >> n >> q >> seed;
	L = (int)(ceil((log2(n))));
	int a;
	_for (i, 1, n)
	{
		cin >> a;
		if (! a)  root = i;
		else  add(i, a), add(a, i);
	}
	
	BB[1] = 0;
	_for (i, 2, n)  BB[i] = BB[i >> 1] + 1;
	
	dfs1(root, 0);
	dfs2(root, 0, root);
	
	int x, k, ggg = 0;
	_for (i, 1, q)
	{
		x = ((get(seed) ^ ggg) % n) + 1;
		k = (get(seed) ^ ggg) % dep[x];
		ggg = solve(x, k);
		ans ^= i * ggg;
	}
	
	cout << ans << endl;
	
	return 0;
}







2022/8/23 21:28
加载中...