85pts求调(WA)
  • 板块灌水区
  • 楼主cjywl
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/20 12:37
  • 上次更新2025/1/20 15:04:52
查看原帖
85pts求调(WA)
738405
cjywl楼主2025/1/20 12:37

题目:https://www.luogu.com.cn/problem/P5658

#include <bits/stdc++.h>
#define ll long long
#define R register
#define rep(i, x, n) for(R int i = x; i <= n; i = -~i)
#define Rep(i, a, b, c) for(R int i = a; i <= b; i += c)
#define endl "\n"
#define spa  printf(" ")
#define fop(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define endl "\n"
#define Yesn puts("Yes")
#define Yes printf("Yes")
#define Non puts("No")
#define No printf("No")
#define YESn puts("YES")
#define YES printf("YES")
#define NOn puts("NO")
#define NO printf("NO")
#define inf 2e18
#define pt printf
#define sf scanf
#define sd "%d"
#define sld "%lld"
#define db double
using namespace std;

void fre() {
#ifdef ONLINE_JUDGE
	fop(brackets);
#endif
}
const int Arr_Max_size = 500005;
//using namespace Fast;
/*
----------------------------------
        This is main code
----------------------------------
*/
int nxt[Arr_Max_size], to[Arr_Max_size], head[Arr_Max_size], cnt;
ll N, ans, f[Arr_Max_size];
ll p[Arr_Max_size], ls[Arr_Max_size], cnnt, sum[Arr_Max_size];
string s;

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

void Dfs(int x) {
	if(s[x] == ')') {
		if(cnnt != 0) {
			p[x] = p[f[ls[cnnt]]] + 1;
			-- cnnt;
		}
	} else if(s[x] == '(') ls[++ cnnt] = x;
	sum[x] = sum[f[x]] + p[x];
	for(int i = head[x]; i != 0; i = nxt[i]) {
		Dfs(to[i]);
	}
	int xx = ls[cnnt];
	ls[++ cnnt] = xx;
}

void solve() {
	cin >> N;
	cin >> s;
	s = " " + s;
	rep(i, 2, N) {
		int x;
		cin >> x;
		add(x, i);
		f[i] = x;
	}
	Dfs(1);
	rep(i, 1, N) {
		ans = ans ^ (sum[i] * (ll)i);
	}
	cout << ans;
}
int main() {
	fre();
	solve();
	return 0;
}
2025/1/20 12:37
加载中...