Submission #1019588

#TimeUsernameProblemLanguageResultExecution timeMemory
1019588vjudge1Zagrade (COI17_zagrade)C++17
10 / 100
3104 ms46008 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define ull unsigned long long #define pii pair<int,int> #define pll pair<long long, long long> #define fi first #define se second #define all(a) (a).begin(), (a).end() #define pb push_back #define lwb lower_bound #define upb upper_bound #define TASKNAME "NAME" void init() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ///freopen(TASKNAME".INP","r",stdin); freopen(TASKNAME".OUT","w",stdout); } const int SZ = 3e5+5; const ll INF = INT_MAX / 2, MOD = 1e9+7, INFLL = 2e18; const double epsilon = 1e-3; int n, a[SZ]; string s; vector<int> adj[SZ]; ll res = 0; bool del[SZ]; void dfsSize(int u, int pre) { s[u] = 1; for(int v : adj[u]) { if(v == pre || del[v]) continue; dfsSize(v,u); s[u] += s[v]; } } int findCentroid(int u, int pre, int treeSize) { for(int v : adj[u]) { if(v == pre || del[v]) continue; if(s[v] > treeSize / 2) return findCentroid(v, u, treeSize); } return u; } int cnt[SZ]; void dfs(int u, int p, int t, int d, int minn){ //t == 0: calculate //t == 1: add //t == 2: delete if (t == 0){ minn = min(minn, d); //if (u == 4 && p == 2) cerr << d << " " << minn << "\n"; if (minn == d){ res += cnt[-minn]; } } if (t == 1){ minn = min(minn + a[u], a[u]); if (minn >= 0) ++cnt[d]; } if (t == 2){ minn = min(minn + a[u], a[u]); if (minn >= 0) --cnt[d]; } for (int i: adj[u]){ if (i == p || del[i]) continue; dfs(i, u, t, d + a[i], minn); } } void updateRes(int root) { if(a[root] == 1) cnt[1] = 1; for(int u : adj[root]) { if(del[u]) continue; dfs(u, root, 0, a[u], 0); dfs(u, root, 1, a[root] + a[u], a[root]); } for(int u : adj[root]) { if(del[u]) continue; dfs(u, root, 2, a[root] + a[u], a[root]); } if (a[root] == 1) cnt[1] = 0; } void solve(int u) { dfsSize(u,0); int root = findCentroid(u, 0, s[u]); del[root] = true; ll preres = res; updateRes(root); //cout << root << " - " << res - preres << '\n'; for(int v : adj[root]) { if(del[v]) continue; solve(v); } } int main() { init(); cin >> n; cin >> s; s = " " + s; for(int i = 1; i <= n; i++) { if(s[i] == '(') a[i] = 1; else a[i] = -1; } for(int i = 1; i < n; i++) { int u,v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } solve(1); for(int i = 1; i <= n; i++) { if(a[i] == 1) a[i] = -1; else a[i] = 1; } memset(del, false, sizeof(del)); solve(1); cout << res; }

Compilation message (stderr)

zagrade.cpp: In function 'void solve(int)':
zagrade.cpp:104:8: warning: unused variable 'preres' [-Wunused-variable]
  104 |     ll preres = res;
      |        ^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...