求吊
查看原帖
求吊
1262406
yhy2024楼主2025/6/13 19:48

70分

#include<bits/stdc++.h>
#define rd read()
#define N 40005
#define K 20005
#define inf INT_MAX
#define int long long
using namespace std;
int n,m,q,k,ans,rt,siz[N],mx[N],x,y,w[N],tot,vis[N];
int cnt1,cnt2,g[N];
char c;
map<int,int>rmx1,rmx2,ok1,ok2;
vector<int>v[N];
struct Node{
	int sum,lmx,lmn,rmx,rmn;
	inline Node operator + (const int &o)const{return {sum+o,max(lmx,sum+o),min(lmn,sum+o),max(o,rmx+o),min(o,rmn+o)};}//(((+)
	inline void Swap(){swap(lmx,rmx),swap(lmn,rmn);}
}s[N];
inline Node operator + (const int &x,const Node &y){return {y.sum+x,max(x,y.lmx+x),min(x,y.lmn+x),max(y.rmx,y.sum+x),min(y.rmn,y.sum+x)};}//)+(((
inline int read()
{
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
		x=x*10+ch-'0',ch=getchar();
	return x;
}
inline void out(Node o){cout<<o.sum<<' '<<o.lmx<<' '<<o.lmn<<' '<<o.rmx<<' '<<o.rmn<<'\n';}
inline void dfs1(int x,int f){
	siz[x]=1,mx[x]=0;
	for(auto t:v[x]){
		if(t==f||vis[t]) continue;
		dfs1(t,x);
		siz[x]+=siz[t];
		mx[x]=max(mx[x],siz[t]);
	}
	mx[x]=max(mx[x],tot-siz[x]);
	if(mx[x]<mx[rt]) rt=x;
}
inline void find(int x,int f,Node d){
	d=w[x]+d;
	s[++cnt1]=d;
//	cout<<x<<' ';out(d);
	for(auto t:v[x]){
		if(t==f||vis[t]) continue;
		find(t,x,d);
	}
}
inline void solve(int x){
	ok1[0]=1,ok2[0]=1;
	for(auto t:v[x]){
		if(vis[t]) continue;
		cnt1=0;
		find(t,x,{0,0,0,0,0});
		for(int i=1;i<=cnt1;i++){
			Node T1=s[i]+w[x];
//			out(T1);
			if(s[i].rmn>=0&&!s[i].sum) ans=max(ans,s[i].rmx);
			if(s[i].lmn>=0&&!s[i].sum) ans=max(ans,s[i].lmx);
			if(T1.rmn>=0&&!T1.sum) ans=max(ans,T1.rmx);
			if(T1.lmn>=0&&!T1.sum) ans=max(ans,T1.lmx);
			s[i].Swap();
			Node T2=s[i]+w[x];
			if(T2.rmn>=0&&!T2.sum) ans=max(ans,T2.rmx);
			if(T2.lmn>=0&&!T2.sum) ans=max(ans,T2.lmx);
//			out(T2);
			s[i].Swap();
			if(T1.lmx<=0&&ok1[-T1.sum]) ans=max(ans,max(T1.rmx-T1.sum,rmx1[-T1.sum]));
			if(T2.rmn>=0&&ok2[-T2.sum]) ans=max(ans,max(T2.rmx,rmx2[-T2.sum]+T2.sum));
		}
		for(int i=1;i<=cnt1;i++){
			if(s[i].rmn>=0) ok1[s[i].sum]=1,rmx1[s[i].sum]=max(rmx1[s[i].sum],s[i].rmx);
			if(s[i].lmx<=0) ok2[s[i].sum]=1,rmx2[s[i].sum]=max(rmx2[s[i].sum],s[i].rmx);
		}
	}
	rmx1.clear();rmx2.clear();ok1.clear();ok2.clear();
}
inline void dfs2(int x){
	vis[x]=1;
	solve(x);
	for(auto t:v[x]){
		if(vis[t]) continue;
		tot=siz[t];rt=0;
		dfs1(t,x);
		dfs2(rt);
	}
}
signed main(){
//	freopen("P3060_6.in","r",stdin);
	cout.tie(0);
	n=rd;
	for(int i=2;i<=n;i++){
		x=rd;
		v[x].push_back(i);
		v[i].push_back(x);
	}
	for(int i=1;i<=n;i++){
		cin>>c;
		if(c=='(') w[i]=1;
		else w[i]=-1;
	}
	srand(time(0));
	mx[rt]=INT_MAX;tot=n;
	dfs1(1,0);
	dfs2(rt);
	cout<<ans;
	return 0;
}
/*
2
1
(
)
*/
2025/6/13 19:48
加载中...