Submission #370138

#TimeUsernameProblemLanguageResultExecution timeMemory
370138Nima_NaderiZagrade (COI17_zagrade)C++14
100 / 100
1504 ms49240 KiB
///In the name of GOD #pragma GCC optimize("O2") #include<bits/stdc++.h> using namespace std; //typedef long long ll; typedef int ll; const ll MXN = 3e5 + 10; ll n, globc; long long ans; ll sub[MXN], bal[MXN], minb[MXN], ted[MXN]; vector<ll> adj[MXN]; bool hide[MXN]; string s; void plant(ll u, ll par){ sub[u] = 1; for(auto v : adj[u]){ if(v != par && !hide[v]){ plant(v, u), sub[u] += sub[v]; } } } ll CRD(ll u, ll par, ll val){ for(auto v : adj[u]){ if(v == par || hide[v]) continue; if(sub[v] >= val) return CRD(v, u, val); } return u; } void Upd(ll u, ll par, ll dt){ if(par == globc) bal[u] = minb[u] = 0; else bal[u] = bal[par], minb[u] = minb[par]; bal[u] += (s[u] == '(' ? +1 : -1); minb[u] = min(minb[u], bal[u]); if(bal[u] <= 0 && minb[u] - bal[u] >= 0){ ted[-bal[u]] += dt; } for(auto v : adj[u]){ if(v == par || hide[v]) continue; Upd(v, u, dt); } } void Calc(ll u, ll par, ll b, ll mb){ b = (s[u] == '(' ? +1 : -1) + b; mb = min(0, (s[u] == '(' ? +1 : -1) + mb); if(mb >= 0){ ans += ted[b]; if(b == 0) ans ++; } for(auto v : adj[u]){ if(v == par || hide[v]) continue; Calc(v, u, b, mb); } } void DMS(ll u, ll h){ plant(u, -1); ll cent = CRD(u, -1, (sub[u] + 1) / 2); globc = cent; for(auto v : adj[cent]){ if(!hide[v]) Upd(v, cent, +1); } for(auto v : adj[cent]){ if(hide[v]) continue; ll x = (s[cent] == '(' ? +1 : -1); Upd(v, cent, -1); Calc(v, cent, x, min(0, x)); Upd(v, cent, +1); } if(s[cent] == '(') ans += ted[1]; for(auto v : adj[cent]){ if(!hide[v]) Upd(v, cent, -1); } hide[cent] = 1; for(auto v : adj[cent]){ if(!hide[v]) DMS(v, h + 1); } } int main(){ ios::sync_with_stdio(0);cin.tie(0); cout.tie(0); cin >> n >> s; s = "$" + s; for(int i = 1; i < n; i ++){ ll u, v; cin >> u >> v; adj[u].push_back(v), adj[v].push_back(u); } DMS(1, 0); cout << ans << '\n'; return 0; } /*! HE'S AN INSTIGATOR, ENEMY ELIMINATOR, AND WHEN HE KNOCKS YOU BETTER YOU BETTER LET HIM IN. */ //! N.N
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...