Submission #1019576

#TimeUsernameProblemLanguageResultExecution timeMemory
1019576vjudge1Zagrade (COI17_zagrade)C++14
100 / 100
654 ms48828 KiB
#include <bits/stdc++.h> #define N 300000 using namespace std; int a[300005]; vector<int> g[300005]; int sz[300005]; int del[300005]; void pre_dfs(int u, int p) { sz[u] = 1; for (int v: g[u]) { if (v != p && del[v] == 0) { pre_dfs(v, u); sz[u] += sz[v]; } } } int cent(int u, int p, int n) { for (int v: g[u]) { if (v != p && sz[v] > n / 2 && del[v] == 0) { return cent(v, u, n); } } return u; } int cnt[600005]; long long ans = 0; void dfs(int u, int p, int s, int k, int type) { if (type == 0) { if (s == min(k, s)) { ans += cnt[-s + N]; } } else if (type == 1) { if (min(a[u], a[u] + k) >= 0) { cnt[s + N]++; } } else { if (min(a[u], a[u] + k) >= 0) { cnt[s + N]--; } } for (int v: g[u]) { if (v != p && del[v] == 0) { if (type == 0) { dfs(v, u, s + a[v], min(k, s), type); } else { dfs(v, u, s + a[v], min(a[u], a[u] + k), type); } } } } void upd(int r) { if (a[r] == 1) { cnt[N + 1] = 1; } for (int v: g[r]) { if (del[v] == 0) { dfs(v, r, a[v], 0, 0); dfs(v, r, a[r] + a[v], a[r], 1); } } for (int v: g[r]) { if (del[v] == 0) { dfs(v, r, a[r] + a[v], a[r], 2); } } if (a[r] == 1) { cnt[N + 1] = 0; } } void solve(int u) { pre_dfs(u, u); int r = cent(u, u, sz[u]); upd(r); del[r] = 1; for (int v: g[r]) { if (del[v] == 0) { solve(v); } } } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; string s; cin >> s; s = '&' + s; for (int i = 1; i <= n; ++i) { a[i] = (s[i] == '(' ? 1 : -1); } for (int i = 1; i <= n - 1; ++i) { int u, v; cin >> u >> v; g[u].emplace_back(v); g[v].emplace_back(u); } memset(del, 0, sizeof del); solve(1); for (int i = 1; i <= n; ++i) { a[i] *= -1; } memset(del, 0, sizeof del); solve(1); cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...