제출 #1337598

#제출 시각아이디문제언어결과실행 시간메모리
1337598MasterDebaterZagrade (COI17_zagrade)C++20
100 / 100
538 ms40904 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+10;
ll n,ans,sz[N],cnt[N+N];
int a[N];
string s;
vector<int>v[N];
bool bio[N];
int Precompute(int node,int parent){
	sz[node]=1;
	for(int i=0;i<v[node].size();i++)if(v[node][i]!=parent and !bio[v[node][i]])sz[node]+=Precompute(v[node][i],node);
	return sz[node];
}
int FindCentroid(int node,int parent,int vel){
	for(int i=0;i<v[node].size();i++)if(v[node][i]!=parent and !bio[v[node][i]] and sz[v[node][i]]>vel/2)return FindCentroid(v[node][i],node,vel);
	return node;
}
void dfs1(int node,int parent,int sum,int mpref,int val,bool b,int suf){
	//if(b)cout<<"___________________\ndfs1: "<<node<<' '<<mpref<<' '<<sum<<'\n';
	mpref=min(sum,mpref);
	suf=max(0,suf);
	if(suf<=0)cnt[sum+N]+=val;
	if(b and mpref>=0 and sum==0 and suf<=0)ans++;
	//if(b)cout<<"_____________ dfs1:\nnode: "<<node<<"\nmpref: "<<mpref<<"\nsuf: "<<suf<<"\nsum: "<<sum<<'\n';
	for(int i=0;i<v[node].size();i++)
		if(v[node][i]!=parent and !bio[v[node][i]]){
			dfs1(v[node][i],node,sum+a[v[node][i]],mpref,val,b,suf+a[v[node][i]]);
		}
	return;
}
void dfs2(int node,int parent,int sum,int mpref){
	mpref=min(0,mpref);
	if(mpref>=0)ans+=cnt[-sum+N];
	//cout<<node<<' '<<mpref<<' '<<sum<<' '<<cnt[-sum+N]<<'\n';
	for(int i=0;i<v[node].size();i++)if(v[node][i]!=parent and !bio[v[node][i]]){
		dfs2(v[node][i],node,sum+a[v[node][i]],mpref+a[v[node][i]]);
	}
	return;
}
void CentroidDecomposition(int node,int parent){
	Precompute(node,-1);
	node=FindCentroid(node,-1,sz[node]);
	//cout<<"CentroidDecomposition: "<<node<<'\n';
	if(s[node]==')')cnt[-1+N]++;
	for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]]){
		dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node]),1,1,max(0,a[node])+a[v[node][i]]);
	}
	
	for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]]){
		dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node])+a[v[node][i]],-1,0,max(0,a[node])+a[v[node][i]]);
		//cout<<"dfs2: "<<v[node][i]<<'\n';
		dfs2(v[node][i],node,a[v[node][i]],a[v[node][i]]);
		dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node])+a[v[node][i]],1,0,max(0,a[node])+a[v[node][i]]);
	}
	if(s[node]==')')cnt[-1+N]--;
	for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]]){
		dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node]),-1,0,max(0,a[node])+a[v[node][i]]);
	}
	//cout<<"ANS: "<<ans<<'\n';
	bio[node]=1;
	for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]])CentroidDecomposition(v[node][i],node);
	return;
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>s;
	for(int i=0;i<n;i++)a[i]=(s[i]=='(')-(s[i]==')');
	//cout<<'\n';
	for(int i=1;i<n;i++){
		int xi,yi;
		cin>>xi>>yi,xi--,yi--;
		v[xi].push_back(yi);
		v[yi].push_back(xi);
	}
	//cnt[0+N]++;
	CentroidDecomposition(0,-1);
	cout<<ans<<'\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...