Submission #50081

#TimeUsernameProblemLanguageResultExecution timeMemory
50081top34051Parachute rings (IOI12_rings)C++17
37 / 100
4077 ms94668 KiB
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6 + 5; int n; vector<int> way[maxn]; vector<int> deg[10]; int cut[maxn]; int sz, cy, vis[maxn]; stack<int> st; map<int,int> ok; void Init(int _n) { n = _n; } void cycle(int u, int last, int ban) { if(vis[u]) { while(!st.empty()) { int v = st.top(); st.pop(); sz++; if(v==u) break; } cy++; return ; } vis[u] = 1; st.push(u); for(auto v : way[u]) { if(v!=ban && v!=last && vis[v]<2) { cycle(v,u,ban); } } vis[u] = 2; if(!st.empty()) st.pop(); } int check(int u) { memset(cut,0,sizeof(cut)); for(auto v : way[u]) cut[v]++; for(int i=1;i<=n;i++) if(i!=u && way[i].size()-cut[i]>2) return 0; sz = cy = 0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) if(i!=u && !vis[i]) cycle(i,0,u); return cy==0; } int CountCritical() { for(int i=0;i<=4;i++) deg[i].clear(); for(int x=1;x<=n;x++) deg[min(4,(int)way[x].size())].push_back(x); if(deg[4].size()) { ok.clear(); if(deg[4].size()<=1) { for(auto u : deg[4]) if(check(u)) ok[u]; } return ok.size(); } if(deg[3].size()) { ok.clear(); for(auto u : deg[3]) { if(check(u)) ok[u]; for(auto v : way[u]) if(check(v)) ok[v]; } return ok.size(); } sz = cy = 0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) if(!vis[i]) cycle(i,0,0); if(cy==0) return n; else if(cy==1) return sz; else return 0; } void Link(int x, int y) { x++; y++; way[x].push_back(y); way[y].push_back(x); }
#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...