Submission #350960

#TimeUsernameProblemLanguageResultExecution timeMemory
350960tengiz05Parachute rings (IOI12_rings)C++17
55 / 100
4056 ms68832 KiB
#ifndef EVAL #include "grader.cpp" #endif #include <bits/stdc++.h> using namespace std; #define pb push_back const int Ni = 1e6+5; vector<int> edges[Ni]; int n, ans; // start of DSU vector<int> p, sz, cyclic; int par(int u){ if(p[u] == u)return u; return p[u] = par(p[u]); } bool IsSame(int u, int v){ return par(u) == par(v); } void merge(int u,int v){ u=par(u);v=par(v); if(u == v)return; p[v] = u; sz[u] += sz[v]; cyclic[u] |= cyclic[v]; return; } int size_of_node(int u){ return sz[par(u)]; }// end of DSU int have_this_number_of_edges[5]; void Init(int N_) { n = N_; ans = n; p.assign(n,0); sz.assign(n,1); cyclic.assign(n,0); for(int i=0;i<n;i++)p[i] = i; have_this_number_of_edges[0] = n; } int number_of_cycles; void del(int u){ have_this_number_of_edges[min(4,(int)edges[u].size())]--; }void add(int u){ have_this_number_of_edges[min(4,(int)edges[u].size())]++; } void Link(int u, int v){ del(u);del(v); edges[u].pb(v); edges[v].pb(u); add(u);add(v); if(IsSame(u, v)){ number_of_cycles++; cyclic[par(u)] = 1; }else { merge(u,v); }return; } int please_dont_go_there; bool is_it_normal; bool used[Ni]; void dfs(int u, int p){ used[u] = true; int cnt = 0; for(auto v : edges[u]){ if(v != please_dont_go_there)cnt++; if(v == p || v == please_dont_go_there)continue; if(used[v])is_it_normal = false; else dfs(v,u); }if(cnt>2)is_it_normal = false; } bool CheckItPlease(int to_delete){ please_dont_go_there = to_delete; for(int j=0;j<n;j++)used[j] = false; used[please_dont_go_there] = true; is_it_normal = true; for(int j=0;j<n;j++){ if(!used[j])dfs(j,j); }return is_it_normal; } int CountCritical(){ if(have_this_number_of_edges[4] > 1)return 0; if(!number_of_cycles && have_this_number_of_edges[3]+have_this_number_of_edges[4]==0)return n; ans = 0; if(have_this_number_of_edges[4] == 1){ int we_need_it; for(int i=0;i<n;i++){ if(edges[i].size() >= 4){ we_need_it = i;break; } } ans += CheckItPlease(we_need_it); }else if(have_this_number_of_edges[3] > 0){ int we_need_it=-1; for(int i=0;i<n;i++){ if(edges[i].size() == 3){ we_need_it = i;break; } }assert(~we_need_it); ans += CheckItPlease(we_need_it); for(auto v : edges[we_need_it])ans += CheckItPlease(v); }else if(have_this_number_of_edges[2] > 0){ if(number_of_cycles > 1)return 0; for(int i=0;i<n;i++){ if(cyclic[par(i)])return size_of_node(i); }assert(false); }else assert(false); return ans; }

Compilation message (stderr)

rings.cpp: In function 'int CountCritical()':
rings.cpp:99:23: warning: 'we_need_it' may be used uninitialized in this function [-Wmaybe-uninitialized]
   99 |   ans += CheckItPlease(we_need_it);
      |          ~~~~~~~~~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...