Submission #245710

#TimeUsernameProblemLanguageResultExecution timeMemory
245710vanicZagrade (COI17_zagrade)C++14
100 / 100
1280 ms57348 KiB
#include <iostream> #include <cstdio> #include <math.h> #include <set> #include <algorithm> #include <stack> #include <vector> #include <map> #include <string.h> #include <queue> #include <array> #include <bitset> using namespace std; const int maxn=3e5+5; typedef long long ll; map < int, int > m; vector < int > upd; vector < int > ms[maxn]; int val[maxn]; bitset < maxn > bio; int vel[maxn]; ll sol; int dfs(int x, int prosl){ vel[x]=1; for(int i=0; i<ms[x].size(); i++){ if(ms[x][i]!=prosl && !bio[ms[x][i]]){ vel[x]+=dfs(ms[x][i], x); } } return vel[x]; } int centroid(int x, int val){ for(int i=0; i<ms[x].size(); i++){ if(!bio[ms[x][i]] && vel[ms[x][i]]>val/2 && vel[ms[x][i]]<vel[x]){ return centroid(ms[x][i], val); } } return x; } int poc; void siri(int x, int prosl, int br, int mini, int maksi){ br+=val[x]; mini=min(mini, br); maksi=max(maksi, br); if(val[x]==-1){ if(br-mini<=0 && br+poc<=0){ sol+=m[-(br+poc)]; upd.push_back(br); } } else{ if(br-maksi>=0 && br+poc>=0){ sol+=m[-(br+poc)]; upd.push_back(br); } } for(int i=0; i<ms[x].size(); i++){ if(ms[x][i]!=prosl && !bio[ms[x][i]]){ siri(ms[x][i], x, br, mini, maksi); } } } void solve(int x){ m[0]=1; poc=val[x]; int prosl=sol; for(int i=0; i<ms[x].size(); i++){ if(!bio[ms[x][i]]){ siri(ms[x][i], x, 0, 0, 0); while(!upd.empty()){ m[upd.back()]++; upd.pop_back(); } } } m.clear(); } void rijesi(int x, int val){ dfs(x, -1); x=centroid(x, val); // cout << x << endl; solve(x); bio[x]=1; int y; for(int i=0; i<ms[x].size(); i++){ if(!bio[ms[x][i]]){ if(vel[ms[x][i]]>vel[x]){ y=val-vel[x]; } else{ y=vel[ms[x][i]]; } rijesi(ms[x][i], y); } } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; string s; cin >> s; int a, b; for(int i=0; i<n-1; i++){ cin >> a >> b; a--; b--; ms[a].push_back(b); ms[b].push_back(a); } for(int i=0; i<n; i++){ if(s[i]=='('){ val[i]=1; } else{ val[i]=-1; } } rijesi(0, n); cout << sol << '\n'; return 0; }

Compilation message (stderr)

zagrade.cpp: In function 'int dfs(int, int)':
zagrade.cpp:29:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ms[x].size(); i++){
               ~^~~~~~~~~~~~~
zagrade.cpp: In function 'int centroid(int, int)':
zagrade.cpp:38:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ms[x].size(); i++){
               ~^~~~~~~~~~~~~
zagrade.cpp: In function 'void siri(int, int, int, int, int)':
zagrade.cpp:64:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ms[x].size(); i++){
               ~^~~~~~~~~~~~~
zagrade.cpp: In function 'void solve(int)':
zagrade.cpp:75:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ms[x].size(); i++){
               ~^~~~~~~~~~~~~
zagrade.cpp:74:6: warning: unused variable 'prosl' [-Wunused-variable]
  int prosl=sol;
      ^~~~~
zagrade.cpp: In function 'void rijesi(int, int)':
zagrade.cpp:94:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ms[x].size(); i++){
               ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...