求助
查看原帖
求助
127925
Kio_楼主2020/11/5 20:46

感觉已经和题解写的差不多了......但只拿了85 pts

求大佬答疑qwq

#include<cstdio>
#include<vector>
#define ll long long
using namespace std;
int n;
vector<int> tree[500020];
char kh[500020];
int stack[500020],cnt,fa[500020];
ll sum[500020],ans[500020];
void dfs(ll x,ll cnt_1){
	int pd=0;
	ans[x] = cnt_1;
	if(kh[x] == '(') pd=1,stack[++cnt] = x;
	else if(cnt){
		pd=2;
		sum[x] = sum[fa[stack[cnt]]] + 1;
		cnt--;
	}
	ans[x] += sum[x];
	for(int i=0;i<tree[x].size();i++){
		dfs(tree[x][i],ans[x]);
	}
	if(pd==1) cnt--;
	if(pd==2) cnt++;
	return;
}
int read(){
	int num=0;
	char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while('0'<=c&&c<='9') num=num*10+c-'0',c=getchar();
	return num;
}
int main(){
	n=read();
	scanf("%s",kh+1);
	for(int i=2;i<=n;i++){
		int a=read();
		tree[a].push_back(i);
		fa[i] = a;
	}
	dfs(1,0);
	ll fnalans=0;
	for(int i=1;i<=n;i++){
	//	sum[i] += sum[i-1];
		fnalans^=1ll*i*ans[i];
	//	printf("%d ",ans[i]);
	}
	printf("%lld",fnalans);
	return 0;
}
2020/11/5 20:46
加载中...