Submission #20984

#TimeUsernameProblemLanguageResultExecution timeMemory
20984gs14004Zagrade (COI17_zagrade)C++11
100 / 100
1479 ms44600 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef pair<int, int> pi;

int n;
char a[300005];
int sz[300005], msz[300005], vis[300005];
vector<int> gph[300005];
vector<int> dfn;

void dfs(int x, int p){
	dfn.push_back(x);
	sz[x] = 1;
	msz[x] = 0;
	for(auto &i : gph[x]){
		if(vis[i] || i == p) continue;
		dfs(i, x);
		msz[x] = max(msz[x], sz[i]);
		sz[x] += sz[i];
	}
}

int get_center(int x){
	dfn.clear();
	dfs(x, -1);
	int cur = 1e9;
	int ret = -1;
	for(auto &i : dfn){
		int w = max(msz[i], (int)dfn.size() - sz[i]);
		if(cur > w){
			cur = w;
			ret = i;
		}
	}
	return ret;
}

void dfs2(int x, int p, vector<int> &v, int dep, int mdep){
	if(a[x] == '(') dep++;
	else dep--;
	mdep = max(mdep, dep);
	if(mdep == dep) v.push_back(dep);
	for(auto &i : gph[x]){
		if(!vis[i] && i != p) dfs2(i, x, v, dep, mdep);
	}
}

void dfs3(int x, int p, vector<int> &v, int dep, int mdep){
	if(a[x] == '(') dep--;
	else dep++;
	mdep = max(mdep, dep);
	if(mdep == dep) v.push_back(dep);
	for(auto &i : gph[x]){
		if(!vis[i] && i != p) dfs3(i, x, v, dep, mdep);
	}
}

int cnt[300005];

lint getp(int x, vector<int> &l, vector<int> &r){
	lint ans = 0;
	for(auto &i : r) cnt[i]++;
	for(auto &i : l) ans += cnt[i];
	for(auto &i : r) cnt[i]--;
	return ans;
}

lint solve(int x){
	vector<int> l, r;
	lint sum = 0;
	int flg = (a[x] == '(' ? -1 : 1);
	for(auto &i : gph[x]){
		if(vis[i]) continue;
		vector<int> tl, tr;
		dfs2(i, x, tl, 0, 0);
		dfs3(i, x, tr, flg, max(flg, 0));
		for(auto &i : tl){
			l.push_back(i);
			if(flg == i) sum++;
		}
		for(auto &i : tr){
			r.push_back(i);
			if(i == 0) sum++;
		}
		sum -= getp(flg, tl, tr);
	}
	sum += getp(flg, l, r);
	return sum;
}

int main(){
	scanf("%d %s",&n,a+1);
	for(int i=1; i<n; i++){
		int s, e;
		scanf("%d %d",&s,&e);
		gph[s].push_back(e);
		gph[e].push_back(s);
	}
	queue<int> que;
	que.push(1);
	lint ans = 0;
	while(!que.empty()){
		int x = que.front();
		que.pop();
		x = get_center(x);
		ans += solve(x);
		vis[x] = 1;
		for(auto &i : gph[x]){
			if(!vis[i]) que.push(i);
		}
	}
	cout << ans;
}

Compilation message (stderr)

zagrade.cpp: In function 'int main()':
zagrade.cpp:93:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %s",&n,a+1);
                       ^
zagrade.cpp:96:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&s,&e);
                       ^

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...