Submission #370059

#TimeUsernameProblemLanguageResultExecution timeMemory
370059AriaHZagrade (COI17_zagrade)C++11
100 / 100
1214 ms92484 KiB
/** Im the best because i work as hard as i possibly can **/

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")
#include <bits/stdc++.h>
using namespace std;

typedef long long                   ll;
typedef long double                 ld;
typedef pair<int,int>               pii;
typedef pair<ll,ll>                 pll;
#define all(x)                      (x).begin(),(x).end()
#define F                           first
#define S                           second
#define Mp                          make_pair
#define fast_io                     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io                     freopen("in.txt" , "r+" , stdin) ; freopen("out.txt" , "w+" , stdout);
#define endl                        "\n"

const int N = 3e5 + 10;
const ll mod = 1e9 + 7;
const ll mod2 = 998244353;
const ll inf = 8e18;
const int LOG = 22;

char C[N];

int n, A[N], hide[N], sub[N];

pii St[N], Fi[N]; /// St[v].F -> min prefix sum chie   St[v].S -> sum chie

ll tot, cnt[N];

vector < int > G[N];

vector < int > subtree[N];

void dfs(int v, int P)
{
	subtree[v].clear();
	sub[v] = 1;
	for(auto u : G[v])
	{
		if(u == P || hide[u]) continue;
		dfs(u, v);
		sub[v] += sub[u];
	}
}

int find(int v, int P, int _n)
{
	for(auto u : G[v])
	{
		if(u == P || hide[u]) continue;
		if(sub[u] * 2 > _n) return find(u, v, _n);
	}
	return v;
}

void calc(int v, int P)
{
	St[v].S = St[P].S + A[v];
	St[v].F = min(St[P].F + A[v], A[v]);
	if(St[v].F >= 0)
	{
		cnt[St[v].S] ++;
	}
	for(auto u : G[v])
	{
		if(u == P || hide[u]) continue;
		calc(u, v);
	}
}

void calc2(int v, int P, int root)
{
	subtree[root].push_back(v);
	Fi[v].S = Fi[P].S + A[v];
	Fi[v].F = min(Fi[P].F, Fi[v].S);
	for(auto u : G[v])
	{
		if(u == P || hide[u]) continue;
		calc2(u, v, root);
	}
}

void dec(int v)
{
	dfs(v, 0);
	int _n = sub[v], centroid = find(v, 0, _n);
	///printf("centroid = %d size = %d\n", centroid, _n);
	St[0] = Mp(0, 0);
	Fi[centroid] = Mp(0, 0);
	for(int i = 0; i <= _n; i ++) cnt[i] = 0;
	calc(centroid, 0);
	for(auto u : G[centroid])
	{
		if(hide[u]) continue;
		calc2(u, centroid, u);
		for(auto cu : subtree[u])
		{
			if(St[cu].F >= 0)
			{
				cnt[St[cu].S] --;
			}
		}
		for(auto cu : subtree[u])
		{
			if(Fi[cu].F == Fi[cu].S)
			{
				tot += cnt[-Fi[cu].F];
			}
		}
		for(auto cu : subtree[u])
		{
			if(St[cu].F >= 0)
			{
				cnt[St[cu].S] ++;
			}
		}
	}
	hide[centroid] = 1;
	tot += cnt[0];
	for(auto u : G[centroid])
	{
		if(hide[u]) continue;
		dec(u);
	}
}

int main()
{
	scanf("%d%s", &n, C);
	for(int i = 0; i < n; i ++)
	{
		A[i + 1] = (C[i] == '('? 1 : -1);
	}
	for(int i = 1; i < n; i ++)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	dec(1);
	printf("%lld", tot);
    return 0;
}

Compilation message (stderr)

zagrade.cpp: In function 'int main()':
zagrade.cpp:133:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  133 |  scanf("%d%s", &n, C);
      |  ~~~~~^~~~~~~~~~~~~~~
zagrade.cpp:141:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  141 |   scanf("%d%d", &a, &b);
      |   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...