10pts求助
查看原帖
10pts求助
230875
Surge_of_Force楼主2021/9/30 19:38

思路和题解一差不多

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAX=5e5+10;
inline int read()
{
	char qwqc=getchar();
	int qwqf=1,qwqx=0;
	while(qwqc<'0'||qwqc>'9')
	{
		if(qwqc=='-') qwqf=-1;
		qwqc=getchar();
	}
	while(qwqc>='0'&&qwqc<='9')
	{
		qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);
		qwqc=getchar();
	}
	return qwqf*qwqx;
}
int ans;
struct node{int f,l,r,w,ans,topp;}a[MAX];//w存权值,"("为1,")"为0 
void ask(int k,int num)
{
	if(a[k].w) 
	{
		a[k].ans=a[a[k].f].ans;
		a[k].topp=a[a[k].f].topp+1;
	}
	if(!a[k].w)
	{
		a[k].topp=a[a[k].f].topp;
		if(a[k].topp)
		{
			if(a[a[k].f].w)
			{
				a[k].topp--;
				num++;
				a[k].ans=a[a[k].f].ans+num;
			}
			if(!a[a[k].f].w)
			{
				a[k].topp--;
				num=1;
				a[k].ans=a[a[k].f].ans+1;
			} 
		}
		else
		{
			num=0;
			a[k].ans=a[a[k].f].ans;
		}
		
	}
	cout<<a[k].ans<<endl;
	//ans^=(k*a[k].ans);
	if(a[k].l) ask(a[k].l,num);
	if(a[k].r) ask(a[k].r,num);
}
signed main()
{
	int n=read();
	for(int i=1;i<=n;i++)
	{
		char c=getchar();
		if(c=='(') a[i].w=1;
		if(c==')') a[i].w=0;
	}
	for(int i=2;i<=n;i++)
	{
		int x;
		cin>>x;
		a[i].f=x;
		if(!a[x].l) a[x].l=i;
		else a[x].r=i;
	}
	ask(1,0);
	//cout<<ans<<endl;
	return 0;
}
2021/9/30 19:38
加载中...