Submission #137491

#TimeUsernameProblemLanguageResultExecution timeMemory
137491mohammedehab2002Parachute rings (IOI12_rings)C++11
100 / 100
2690 ms80592 KiB
#include <bits/stdc++.h> using namespace std; vector<pair<int,int> > e; struct graph { int v,par[1000005],deg[1000005],sz[1000005],cyc,csz; pair<int,int> mx; graph() { v=-1; cyc=0; mx={0,0}; for (int i=0;i<1e6;i++) { par[i]=i; deg[i]=0; sz[i]=1; } } int find(int x) { if (par[x]!=x) par[x]=find(par[x]); return par[x]; } void Union(int x,int y) { deg[x]++; deg[y]++; mx=max(mx,{deg[x],x}); mx=max(mx,{deg[y],y}); x=find(x); y=find(y); if (x==y) { cyc++; csz=sz[x]; } else { par[x]=y; sz[y]+=sz[x]; } } }; int n; graph g[5]; bool f; void Init(int nn) { n=nn; } void Link(int a,int b) { e.push_back({a,b}); if (!f) { g[0].Union(a,b); if (g[0].mx.first==3) { f=1; vector<int> cur({g[0].mx.second}); for (auto p:e) { if (p.first==cur[0] || p.second==cur[0]) cur.push_back(p.first^p.second^cur[0]); } for (int i=0;i<4;i++) { g[i+1].v=cur[i]; for (auto p:e) { if (p.first!=cur[i] && p.second!=cur[i]) g[i+1].Union(p.first,p.second); } } } } else { for (int i=1;i<5;i++) { if (g[i].v!=a && g[i].v!=b) g[i].Union(a,b); } } } int CountCritical() { if (!f) { if (!g[0].cyc) return n; if (g[0].cyc>1) return 0; return g[0].csz; } int ans=0; for (int i=1;i<5;i++) ans+=(g[i].mx.first<=2 && !g[i].cyc); 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...