社区讨论
85pts求调
P5658[CSP-S 2019] 括号树参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjaor5z
- 此快照首次捕获于
- 2025/11/03 23:28 4 个月前
- 此快照最后确认于
- 2025/11/03 23:28 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 501000;
int n;
char s[N];
int st[N], top;
ll sum[N], nst[N], ans;
struct Node {
int head, nxt, fa;
} a[N];
inline void dfs(int x) {
int tmp = 0;
if (s[x] == ')') {
if (top) {
tmp = st[top--];
nst[x] = nst[a[tmp].fa] + 1;
}
} else {
st[++top] = x;
}
sum[x] = sum[a[x].fa] + nst[x];
for (int i = a[x].head; i; i = a[i].nxt) dfs(i);
if (!tmp) s[++top] = tmp;
else if (top) top--;
}
int main() {
scanf("%d", &n);
scanf("%s", s + 1);
for (int i = 2; i <= n; i++) {
int f;
scanf("%d", &f);
a[i].nxt = a[f].head;
a[f].head = i;
a[i].fa = f;
}
dfs(1);
for (int i = 1; i <= n; i++)
ans ^= (ll)i * sum[i];
printf("%lld\n", ans);
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...