社区讨论
85分 过不了8,9,10测试点 求大佬看看 orz
P5658[CSP-S 2019] 括号树参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lod7yj4v
- 此快照首次捕获于
- 2023/10/31 02:14 2 年前
- 此快照最后确认于
- 2023/11/05 12:40 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int m=500005;
struct note{
int to;
int next;
}e[m];
long long n,f[m],head[m],sum;
long long k[m],q[m],top,ct[m];
long long ans;
char a[m];
void add(int x,int y){
e[++sum].to=y;
e[sum].next=head[x];
head[x]=sum;
}
void dfs(int x){
int flag,t;
if(a[x]=='('){
q[++top]=x;
flag=1;
}
if(a[x]==')')
if(top!=0){
t=q[top];
ct[x]=ct[f[t]]+1;
top--;
flag=2;
}
k[x]=k[f[x]]+ct[x];
for(long long i=head[x];i;i=e[i].next)
dfs(e[i].to);
if(flag==1)top--;
if(flag==2)q[++top]=t;
}
int main(){
scanf("%lld",&n);
scanf("%s",a+1);
for(long long i=2;i<=n;i++){
long long x;
scanf("%lld",&x);
f[i]=x;
add(x,i);
}
dfs(1);
for(long long i=2;i<=n;i++)
ans^=i*k[i];
printf("%lld",ans);
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...