30分求助
查看原帖
30分求助
502658
Ray662楼主2022/8/22 16:00

3个AC,2个WA,3个TLE,2个MLE

#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, cnt, ans, temp, timer, tt;
int head[N], UP[N][M], Tin[N], Tout[N], dep[N];
struct edge { int to, next; } e[N];

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

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

void dfs(int u, int fa)
{
	dep[u] = dep[fa] + 1;
	UP[u][0] = fa;
	_for (i, 1, M - 1)  UP[u][i] = UP[UP[u][i - 1]][i - 1];
	
	for (int i = head[u], v; i; i = e[i].next)
	{
		v = e[i].to;
		if (v != fa)  dfs(v, u);
	}
}

int climb(int u, int step)
{
	tt = M - 1;
	while (step && tt >= 0)
	{
		if (step >= (1 << tt))
			step -= (1 << tt), u = UP[u][tt];
		tt -- ;
	}
	return u;
}

signed main()
{
	ios :: sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	cin >> n >> q >> seed;
	L = (int)(ceil((log2(n))));
	int fa;
	_for (i, 1, n)
	{
		cin >> fa;
		if (! fa)  root = i;
		else  add(fa, i), add(i, fa);
	}
	
	dfs(root, 0);
	
	int x, k;
	_for (i, 1, q)
	{
		x = ((get(seed) ^ temp) % n) + 1;
		k = (get(seed) ^ temp) % dep[x];
		temp = climb(x, k);
		ans ^= i * temp;
//		cout << "[" << i << "] " << x << " " << k << " " << temp << endl;
	}
	
	cout << ans << endl;
	
	return 0;
}
2022/8/22 16:00
加载中...