10pts WA求调 玄关
查看原帖
10pts WA求调 玄关
1005363
lcx_vamos楼主2025/7/21 21:36
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define endl '\n'
#define ui unsigned int
#define int long long
ui s;

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

const int N = 5e5 + 5;

int n, q;
int son[N], dep[N], maxdep[N], fa[N][20], lg[N];
vector<int> T[N];
int bel[N], num[N]; //bel属于哪条长链,num:i在他所属长链位于第几个
vector<int> lk[N];

void dfs1(int u, int p) {
	dep[u] = dep[p] + 1;
	maxdep[u] = dep[u];
	fa[u][0] = p;
	for (int k = 1; k <= 20 && 1 << k <= dep[u]; k++)
		fa[u][k] = fa[fa[u][k - 1]][k - 1];
	for (int &v : T[u]) {
		dfs1(v, u);
		if (maxdep[v] > maxdep[son[u]]) son[u] = v;
	}
	maxdep[u] = max(maxdep[u], maxdep[son[u]] + 1);
}

void dfs2(int u, int tpk) {
	bel[u] = tpk;
	lk[tpk].push_back(u);
	num[u] = lk[tpk].size();
	if (son[u]) dfs2(son[u], tpk);
	for (int &v : T[u]) {
		if (v == son[u] || v == fa[u][0]) continue;
		dfs2(v, v);
	}
}

int solve(int x, int k) {
	if (k == 0) return x;
	int step = lg[k];
	k -= 1 << step;
	x = fa[x][step];
	if (k == 0) return x;
//	cout << x << ' ' << k << " " << num[x] << " " << bel[x] << endl;
	if (k < num[x]) return lk[bel[x]][num[x] - k - 1]; //在该长链上有答案
	k -= num[x] - 1;
	x = bel[x];//跳到顶端
	k--; 
	x = fa[x][0];//跳到上一条链
	return lk[bel[x]][num[x] - k - 1];
}

signed main() {
	IOS;
	int root;
	cin >> n >> q >> s;
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		if (!x) root = i;
		T[x].push_back(i);
	}
//	cout << root << endl;
	dep[root] = 0;
	dfs1(root, root);
	dfs2(root, root);
//	for (int i = 1; i <= n; i++) cout << son[i] << ' ';
//	cout << endl;
	lg[1] = 0;
	for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
	int ans = 0, res = 0;
	for (int i = 1; i <= q; i++) {
		int x = ((get(s) ^ ans) % n) + 1;
//		cout << "sb" << endl;
		int k = (get(s) ^ ans) % dep[x];
//		cout << x << ' ' << k << endl;
		ans = solve(x, k);
		res ^= i * ans;
//		cout << solve(x, k) << endl;
	}
	cout <<res << endl;
	return 0;
}

2025/7/21 21:36
加载中...