社区讨论

85pts求问!!玄关

P5658[CSP-S 2019] 括号树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhz4anjk
此快照首次捕获于
2025/11/15 01:14
4 个月前
此快照最后确认于
2025/11/16 13:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int ans;
char s[500005];
vector<int> e[500005];
int fa[500005];
int lst[500005];
int sum[500005];
void read(int &k){
	int x=0;
	char a=getchar();
	while(a<48||a>57) 
	a=getchar();
	while(a>=48&&a<=57){
		x=x*10+a-48;
		a=getchar();
	}
	k=x;
}
void write(int k){
	if(k>9) write(k/10);
	putchar(k%10+48);
}
int st[500005];
int top=0;
void dfs(int k){
	int ttop=top;
	if(top==0){
		if(s[k]=='(')
		st[++top]=k;
	}
	else{
		if(s[k]==')'){
			lst[k]=lst[fa[st[top]]]+1;
			top--;
		}
		else st[++top]=k;
	}
	sum[k]=sum[fa[k]]+lst[k];
	for(int i=0;i<e[k].size();i++){
		int v=e[k][i];
		dfs(v);
	}
	if(ttop>top){
		top++;
	}
	else if(ttop<top) top--;
}
signed main(){
	
	read(n);
	for(int i=1;i<=n;i++){
		s[i]=getchar();
	}
	for(int i=2;i<=n;i++){
		read(fa[i]);
		e[fa[i]].push_back(i);
	}
	dfs(1);
	for(int i=1;i<=n;i++){
		ans^=i*sum[i];
	}
	write(ans);
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...