This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pb push_back
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " : " << x << '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<ll, ll> pll;
const ll Mod = 1000000007LL;
const int N = 3e5 + 10;
const ll Inf = 2242545357980376863LL;
const ll Log = 30;
int n, a[N], mk[N];
vector<int> G[N];
ll ans = 0;
int sz[N];
int DFS(int u, int p){
sz[u] = 1;
for(auto adj : G[u])
if(adj != p && !mk[adj])
sz[u] += DFS(adj, u);
return sz[u];
}
vector<int> V2, V3;
void DFS2(int u, int p, int sm, int mn){
sm += a[u]; mn = min(mn, sm);
if(sm == mn){
if(mn == 0) ans ++;
V2.pb(mn);
}
for(auto adj : G[u])
if(adj != p && !mk[adj])
DFS2(adj, u, sm, mn);
}
int tr;
void DFS3(int u, int p, int sm, int mn){
sm -= a[u]; mn = min(mn, sm);
if(sm == mn){
if(tr && mn == -1) ans ++;
V3.pb(mn);
}
for(auto adj : G[u])
if(adj != p && !mk[adj])
DFS3(adj, u, sm, mn);
}
int cnt2[N], cnt3[N];
void Centroid(int u){
int m = DFS(u, -1);
int fl = 1;
int cen = u;
while(fl){
fl = 0;
for(auto adj : G[cen]){
if(!mk[adj] && sz[adj] < sz[cen] && sz[adj] + sz[adj] >= m){
cen = adj;
fl = 1;
break;
}
}
}
//debug(cen);
for(int i = 0; i <= m; i++) cnt2[i] = 0, cnt3[i] = 0;
mk[cen] = 1;
for(auto adj : G[cen]){
if(mk[adj]) continue;
V2.clear(); V3.clear();
DFS2(adj, cen, a[cen], min(a[cen], 0));
if(a[cen] == -1) tr = 1;
else tr = 0;
DFS3(adj, cen, 0, 0);
for(auto &x : V2) ans += cnt3[-x];
for(auto &x : V3) ans += cnt2[-x];
for(auto &x : V2) cnt2[-x] ++;
for(auto &x : V3) cnt3[-x] ++;
}
//debug(ans);
for(auto adj : G[cen]){
if(mk[adj]) continue;
Centroid(adj);
}
return ;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
char c;
for(int i = 1; i <= n; i++){
cin >> c;
a[i] = (c == '(' ? 1 : -1);
}
int u, v;
for(int i = 1; i < n; i++){
cin >> u >> v;
G[u].pb(v);
G[v].pb(u);
}
Centroid(1);
cout << ans << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |