Submission #990635

#TimeUsernameProblemLanguageResultExecution timeMemory
990635ZeroCoolZagrade (COI17_zagrade)C++14
100 / 100
717 ms60992 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; template<typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define int long long #define ll long long #define ar array #define ld long double //#define endl '\n' const ll N = 4e5 + 20; const ll INF = 1e17; const int MOD = 1e9 + 7; int n, A[N], del[N], ans, sz[N]; vector<int> g[N]; map<int,int> cnt; int dfs1(int x,int p){ sz[x] = 1; for(auto u : g[x]){ if(u == p || del[u])continue; sz[x] += dfs1(u, x); } return sz[x]; } int C(int x,int p,int s){ for(auto u: g[x]){ if(u == p || del[u])continue; if(sz[u] * 2 > s)return C(u, x, s); } return x; } void dfs2(int x,int p, int sum, int mn,int mx){ sum += A[x]; mx = max(mx, sum); mn = min(mn, sum); if(sum <= mn){ ans += cnt[-mn]; } for(auto u: g[x]){ if(u == p || del[u])continue; dfs2(u, x, sum, mn, mx); } } void dfs3(int x,int p,int sum, int mn,int mx){ sum += A[x]; mx = max(mx, sum); mn = min(mn, sum); if(sum >= mx){ cnt[sum]++; } for(auto u: g[x]){ if(u == p || del[u])continue; dfs3(u, x, sum, mn, mx); } } void cen(int x){ int c = C(x, x, dfs1(x, x)); del[c] = 1; cnt.clear(); if(A[c] == 1)cnt[A[c]]++; for(auto u: g[c]){ if(del[u])continue; dfs2(u, c, 0, 0, 0); dfs3(u, c, A[c], min(A[c], 0ll), max(A[c], 0ll)); } ans += cnt[0]; cnt.clear(); reverse(g[c].begin(), g[c].end()); for(auto u: g[c]){ if(del[u])continue; dfs2(u, c, 0, 0, 0); dfs3(u, c, A[c], min(A[c], 0ll), max(A[c], 0ll)); } for(auto u: g[c]){ if(!del[u])cen(u); } } void VladiDadi(){ cin>>n; string s; cin>>s; for(int i = 0;i<n;i++)A[i] = (s[i] == '(' ? 1 : -1); for(int i =1 ;i<n;i++){ int u, v; cin>>u>>v; --u, --v; g[u].push_back(v); g[v].push_back(u); } cen(0); cout<<ans; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); int t = 1; //cin>>t; while(t--) VladiDadi(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...