Submission #1016054

#TimeUsernameProblemLanguageResultExecution timeMemory
1016054NintsiChkhaidzeParachute rings (IOI12_rings)C++17
100 / 100
771 ms119276 KiB
#include <bits/stdc++.h> #define pb push_back #define s second #define f first #define pii pair <int,int> using namespace std; const int N = 1e6 + 5; vector <int> cycles,v[N]; vector <pii> edges; int deg[N],n,nodes,p[N]; bool crit; int critical[7],m,fail[7],degree[7][N]; int pp[7][N],sz[N]; void Init(int N_) { crit=0; n = N_; for (int i = 0; i < n; i++) p[i] = i,sz[i] = 1; } int P(int x){ if(x==p[x]) return x; return p[x]=P(p[x]); } void dsu(int x,int y){ int px=P(x),py=P(y); if (px == py){ cycles.pb(sz[px]); return; } p[py] = px; sz[px] += sz[py]; sz[py] = 0; } int PP(int i,int x){ if(pp[i][x] == x) return x; return pp[i][x] = PP(i,pp[i][x]); } void dsuu(int i,int x,int y){ int px=PP(i,x),py=PP(i,y); if (px == py){ fail[i] = 1; return; } pp[i][py] = px; } void addedge(int i,int x,int y){ if (fail[i]) return; if (x == critical[i] || y == critical[i]) return; degree[i][x]++; degree[i][y]++; if (degree[i][x] > 2 || degree[i][y] > 2) { fail[i] = 1; return; } dsuu(i,x,y); } void Link(int A, int B) { bool old = crit; deg[A]++; deg[B]++; v[A].pb(B); v[B].pb(A); edges.pb({A,B}); if (!crit){ if (deg[A] >= 3){ crit = 1; if (deg[A] >= 4){ m = 1; critical[1] = A; } else{ m = 4; critical[1] = A; critical[2] = v[A][0]; critical[3] = v[A][1]; critical[4] = v[A][2]; } } } if (!crit){ if (deg[B] >= 3){ crit = 1; if (deg[B] >= 4){ m = 1; critical[1] = B; } else{ m = 4; critical[1] = B; critical[2] = v[B][0]; critical[3] = v[B][1]; critical[4] = v[B][2]; } } } if (old){ for (int i = 1; i <= m; i++){ addedge(i,A,B); } }else if (!old && crit){ for (int i = 1; i <= m; i++){ fail[i] = 0; for (int j = 0; j < n; j++){ pp[i][j] = j; } for (auto [x,y]: edges){ addedge(i,x,y); } } } if (crit) return; dsu(A,B); } int CountCritical() { if (crit){ int ans=0; for (int i = 1; i <= m; i++){ ans += (!fail[i]); } return ans; } int ans = 0; if (!cycles.size()) ans = n; else if ((int)cycles.size() == 1) ans = cycles[0]; return ans; }
#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...