Submission #1019537

#TimeUsernameProblemLanguageResultExecution timeMemory
1019537vjudge1Zagrade (COI17_zagrade)C++17
10 / 100
3073 ms45920 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, OFFSET = 3e5; 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 + SZ]; vector<int> cur; void dfs(int u, int pre, int root, int sum, int mn1, int mn2) { if(mn2 >= 0) cur.pb(sum); if(mn1 == sum) { res += 1LL * cnt[-sum]; } // if(root == 2) // { // cout << u << " " << sum << " " << mn1 << " " << mn2 << '\n'; // } if(sum == 0) { if(mn1 >= 0) res++; //if(mn1 >= 0 && root == 2) cout << "a\n"; } for(int v : adj[u]) { if(del[v] || v == pre) continue; dfs(v, u, root, sum + a[v], min(mn1, sum + a[v]), min(a[v], a[v] + mn2)); } } vector<int> vec; void updateRes(int root) { while(!vec.empty()) { cnt[vec.back()]--; vec.pop_back(); } for(int u : adj[root]) { if(del[u]) continue; int sum = a[root], mn = a[root]; dfs(u, root, root, sum + a[u], min(mn, sum + a[u]), min(a[u], a[u] + mn)); while(!cur.empty()) { cnt[cur.back() - a[root]]++; vec.pb(cur.back() - a[root]); cur.pop_back(); } } } 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 >> s; for(int i = 0; i < s.length(); i++) { if(s[i] == '(') a[i+1] = 1; else a[i+1] = -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)); cur.clear(); solve(1); cout << res; }

Compilation message (stderr)

zagrade.cpp: In function 'void solve(int)':
zagrade.cpp:108:8: warning: unused variable 'preres' [-Wunused-variable]
  108 |     ll preres = res;
      |        ^~~~~~
zagrade.cpp: In function 'int main()':
zagrade.cpp:122:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |     for(int i = 0; i < s.length(); i++)
      |                    ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...