Submission #743748

#TimeUsernameProblemLanguageResultExecution timeMemory
743748nvujicaZagrade (COI17_zagrade)C++14
100 / 100
277 ms75120 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second using namespace std; const int maxn = 3e5 + 10; int n; ll sol; int a[maxn]; set <pair<int, int> > s[maxn]; vector <int> v[maxn]; int d[maxn]; void spoji(int x, int y){ // cout << x << ' ' << y << endl; auto it = s[y].lower_bound({-d[y] - a[x], 0}); if(it != s[y].end() && (*it).fi == -d[y] - a[x]) s[y].erase(it); //cout << "jos sam tu" << endl; int y2 = y; if(s[x].size() < s[y].size()){ swap(s[x], s[y]); swap(d[x], d[y]); y2 = x; } vector <pair<int, int> > t; while(!s[y].empty()){ //cout << "tu sam" << endl; int br = s[y].begin() -> fi; int cnt = s[y].begin() -> se; s[y].erase(s[y].begin()); t.push_back({br, cnt}); auto it = s[x].lower_bound({-(br + d[y]) - d[x], 0}); if(it != s[x].end() && (*it).fi == -(br + d[y]) - d[x]){ sol += cnt * (*it).se; // cout << x << ' ' << y << ' ' << cnt << ' ' << (*it).se << endl; } } d[y2] += a[x]; for(int i = 0; i < t.size(); i++){ int br = t[i].fi; int cnt = t[i].se; //cout << br << ' ' << cnt; auto it = s[x].lower_bound({br + d[y] - d[x], 0}); if(it != s[x].end() && (*it).fi == br + d[y] - d[x]){ cnt += (*it).se; s[x].erase(it); } s[x].insert({br + d[y] - d[x], cnt}); } } void rek(int x, int p){ s[x].insert({2 * a[x], 1}); for(int i = 0; i < v[x].size(); i++){ int x2 = v[x][i]; if(x2 == p) continue; rek(x2, x); spoji(x, x2); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 1; i <= n; i++){ char c; cin >> c; if(c == '(') a[i] = 1; else a[i] = -1; } for(int i = 0; i < n - 1; i++){ int x, y; cin >> x >> y; v[x].push_back(y); v[y].push_back(x); } rek(1, 0); cout << sol; return 0; }

Compilation message (stderr)

zagrade.cpp: In function 'void spoji(int, int)':
zagrade.cpp:54:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |  for(int i = 0; i < t.size(); i++){
      |                 ~~^~~~~~~~~~
zagrade.cpp: In function 'void rek(int, int)':
zagrade.cpp:73:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |  for(int i = 0; i < v[x].size(); i++){
      |                 ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...