为什么要保证 p[i] < j ?
查看原帖
为什么要保证 p[i] < j ?
800543
NirvanaCeleste楼主2024/7/26 10:42
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6 + 7;
int n, o, f[N], p[N], d[N];
long long ans;
inline void rd(int& qwq){
	int awa = 0,w = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') w = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		awa = awa * 10 + ch - '0';
		ch = getchar();
	}
	qwq = awa * w;
}
inline void TP() {
	for (int i = 1; i < n; i++) rd(f[i]), ++d[f[i]];
	for (int i = 1, j = 1; i <= n - 2; i++, j++) {
		while (d[j]) ++j;
		p[i] = f[j];
		while (i <= n - 2 && !--d[p[i]] && p[i] < j) p[i+1] = f[p[i]], ++i;
	}
	for (int i = 1; i <= n - 2; i++) ans ^= 1ll * i * p[i];
}

inline void PT() {
	for (int i = 1; i <= n - 2; i++) rd(p[i]), ++d[p[i]];
	p[n-1] = n;
	for (int i = 1, j = 1; i < n; i++, j++) {
		while (d[j]) ++j;
		f[j] = p[i];
		while (i < n && !--d[p[i]] && p[i] < j) f[p[i]] = p[i+1], ++i;
	}
	for (int i = 1; i < n; i++) ans ^= 1ll * i * f[i];
}

int main() {
	rd(n), rd(o), o == 1 ? TP() : PT();
	cout<<ans;
	return 0;
}
2024/7/26 10:42
加载中...