Submission #66391

#TimeUsernameProblemLanguageResultExecution timeMemory
66391hamzqq9Zagrade (COI17_zagrade)C++14
100 / 100
1817 ms39152 KiB
#include<bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define ppb pop_back
#define umax(x,y) x=max(x,y)
#define umin(x,y) x=min(x,y)
#define ll long long
#define ii pair<int,int>
#define iii pair<ii,int>
#define sz(x) (x.size())
#define orta ((bas+son)>>1)
#define all(x) x.begin(),x.end()
#define dbgs(x) cerr<<(#x)<<" --> "<<(x)<<" "
#define dbg(x) cerr<<(#x)<<" --> "<<(x)<<endl;getchar()
#define pw(x) (1<<(x))
#define inf 1000000000
#define MOD 1000000007
#define N 300005
#define MAX 10000006
#define LOG 20
#define count anan
using namespace std;

int sub[N],F[N],count[N];
int n,x,y,Gsub;
ll ans;
vector<int> v[N];
char s[N];

void dfs_to(int node,int ata,int bal,int prob,int add) {

	if(bal==0 && s[node]=='(') prob++;

	bal=min(0,bal+(s[node]=='('?1:-1));

	if(bal==0) count[prob]+=add;

	for(int i:v[node]) {

		if(i==ata || F[i]) continue ;

		dfs_to(i,node,bal,prob,add); 

	}

}

void dfs_from(int node,int ata,int bal,int prob) {

	if(bal==0 && s[node]==')') prob++;

	bal=max(0,bal+(s[node]=='('?1:-1));

	if(bal==0) ans+=count[prob];

	for(int i:v[node]) {

		if(i==ata || F[i]) continue ;

		dfs_from(i,node,bal,prob);

	}

}

void fsubs(int node,int ata) {

	sub[node]=1;

	for(int i:v[node]) {
		
		if(i==ata || F[i]) continue ;

		fsubs(i,node);

		sub[node]+=sub[i];

	}

}

int fcnt(int node,int ata) {

	for(int i:v[node]) {

		if(i==ata || F[i]) continue ;

		if(sub[i]>Gsub/2) return fcnt(i,node);

	}

	return node;

}

void solve(int node) {

	fsubs(node,0);

	Gsub=sub[node];

	int cnt=fcnt(node,0);

	F[cnt]=1;

	count[0]++;

	for(int i:v[cnt]) {

		if(F[i]) continue ;

		dfs_from(i,cnt,s[cnt]=='(',s[cnt]==')');

		dfs_to(i,cnt,0,0,1);

	}

	if(s[cnt]==')') ans+=count[1];

	for(int i:v[cnt]) {

		if(F[i]) continue ;

		dfs_to(i,cnt,0,0,-1);

	}

//	printf("PHCNT %d A %d\n",cnt,ans);

	reverse(all(v[cnt]));

	count[0]--;

	for(int i:v[cnt]) {

		if(F[i]) continue ;

		dfs_from(i,cnt,s[cnt]=='(',s[cnt]==')');

		dfs_to(i,cnt,0,0,1);

	}

	for(int i:v[cnt]) {

		if(F[i]) continue ;

		dfs_to(i,cnt,0,0,-1);

	}	

//	printf("C%d A%d\n",cnt,ans);

	for(int i:v[cnt]) {

		if(F[i]) continue ;

		solve(i);

	}

}

int main() {

//	freopen("input.txt","r",stdin);

	scanf("%d",&n);

	scanf("%s",s+1);

	for(int i=1;i<n;i++) {

		scanf("%d %d",&x,&y);

		v[x].pb(y);
		v[y].pb(x);

	}

	solve(1);

	printf("%lld",ans);

}

Compilation message (stderr)

zagrade.cpp: In function 'int main()':
zagrade.cpp:169:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~
zagrade.cpp:171:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s",s+1);
  ~~~~~^~~~~~~~~~
zagrade.cpp:175:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&x,&y);
   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...