Submission #1308850

#TimeUsernameProblemLanguageResultExecution timeMemory
1308850viliZagrade (COI17_zagrade)C++20
0 / 100
394 ms38532 KiB
#include <bits/stdc++.h> using namespace std; #define LL long long #define int LL #define PB push_back const int N = 6e5 + 5; vector<int> v[N]; int sz[N]; bool flg[N]; string s; int put[N]; long long rj = 0; vector<int> touched; int zbroji(char a) { return (a == '(' ? 1 : -1); } void dfs(int tr, int pr = -1) { sz[tr] = 1; for (int nx : v[tr]) { if (nx == pr || flg[nx]) continue; dfs(nx, tr); sz[tr] += sz[nx]; } } int fnd_cnt(int tr, int n, int pr = -1) { for (int nx : v[tr]) { if (nx == pr || flg[nx]) continue; if (sz[nx] * 2 > n) return fnd_cnt(nx, n, tr); } return tr; } void umi(int tr, int pr, bool cnt, int br, int brm, int md) { br += zbroji(s[tr]); brm += zbroji(s[tr]); brm = min(0LL, brm); md = min(md, br); if (cnt) { if (br <= 0 && br == md) { if (-br < N) rj += put[-br]; } } else { if (brm >= 0 && br >= 0) { if (put[br] == 0) touched.PB(br); put[br]++; } } for (int nx : v[tr]) { if (nx == pr || flg[nx]) continue; umi(nx, tr, cnt, br, brm, md); } } void clear_put() { for (int x : touched) put[x] = 0; touched.clear(); } void cnt(int tr) { dfs(tr); int c = fnd_cnt(tr, sz[tr]); flg[c] = true; int delta = zbroji(s[c]); put[0] = 1; touched.PB(0); for (int nx : v[c]) { if (flg[nx]) continue; umi(nx, c, true, delta, delta, delta); umi(nx, c, false, 0, 0, 0); } if (delta < 0 && -delta < N) rj += put[-delta]; clear_put(); reverse(v[c].begin(), v[c].end()); put[0] = 1; touched.PB(0); for (int nx : v[c]) { if (flg[nx]) continue; umi(nx, c, true, delta, delta, delta); umi(nx, c, false, 0, 0, 0); } clear_put(); for (int nx : v[c]) { if (!flg[nx]) cnt(nx); } } void solve() { int n; cin >> n; cin >> s; s = ' ' + s; for (int i = 0; i < n - 1; i++) { int a, b; cin >> a >> b; v[a].PB(b); v[b].PB(a); } cnt(1); cout << rj << '\n'; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...