Submission #132462

#TimeUsernameProblemLanguageResultExecution timeMemory
132462arthurconmyParachute rings (IOI12_rings)C++14
0 / 100
1403 ms80248 KiB
/* Arthur Conmy / arthurconmy */ #include <iostream> #include <fstream> #include <vector> #include <string> #include <cmath> #include <algorithm> #include <map> #include <queue> #include <bitset> #include <random> #include <stack> #include <deque> #include <chrono> using namespace std; const int MAXN=1000001; // GENERAL int n; vector<int> adj[MAXN]; int deg[MAXN]; int v_max=0; int d_max=0; // DSU int link[MAXN]; int sz[MAXN]; int no_cycles=0; int cycle_size=-1; // DFS bool vis[MAXN]; int prior=-1; bool dfs(int b4, int u) { vis[u]=1; for(auto v:adj[u]) { if(vis[v] && v!=b4) return false; if(vis[v]) continue; bool b = dfs(u,v); if(!b) return false; } return true; } int emp(int a) { while(a!=link[a]) a=link[a]; return a; } void join(int a, int b) { a=emp(a); b=emp(b); if(a==b) return; if(sz[a]<sz[b]) swap(a,b); sz[a]+=sz[b]; link[b]=a; } void Init(int N) { n=N; for(int i=0; i<n; i++) { link[i]=i; sz[i]=1; } } void Link(int A, int B) { adj[A].push_back(B); adj[B].push_back(A); deg[A]++; deg[B]++; if(deg[B]>deg[A]) swap(A,B); if(deg[A] > d_max) { d_max=deg[A]+1; v_max=A; } if(emp(A)==emp(B)) { no_cycles++; cycle_size=sz[emp(A)]; } join(A,B); } int CountCritical() { if(d_max < 2) { return n; } if(d_max == 2) { if(no_cycles==0) return n; if(no_cycles>1) return 0; return cycle_size; } vector<int> trying = {v_max}; if(d_max==3) { for(auto u:adj[v_max]) trying.push_back(u); } int no_that_work=0; for(auto v:trying) { for(int i=0; i<n; i++) vis[i]=0; bool works=1; for(auto u:adj[v]) { deg[u]--; } for(int i=1; i<MAXN; i++) { if(i==v) continue; if(deg[i] > 2) works=0; } for(auto u:adj[v]) { deg[u]++; } if(!works) continue; for(int i=0; i<n; i++) { if(vis[i]) continue; bool b2 = dfs(-1,i); if(!b2) { works=0; break; } } if(works) no_that_work++; } return no_that_work; } // void thing() // { // cout << CountCritical() << endl; // } // int main() // { // #ifdef ARTHUR_LOCAL // ifstream cin("input.txt"); // #endif // Init(6); // thing(); // Link(0,1); // thing(); // Link(1,2); // thing(); // Link(2,0); // thing(); // }
#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...