제출 #285233

#제출 시각아이디문제언어결과실행 시간메모리
285233TMJN낙하산 고리들 (IOI12_rings)C++17
100 / 100
1633 ms88440 KiB
#include <bits/stdc++.h> using namespace std; struct UF{ int t[1000000]; void init(){ for(int i=0;i<1000000;i++){ t[i]=-1; } } int par(int x){ if(t[x]<0)return x; return t[x]=par(t[x]); } bool uni(int x,int y){ x=par(x); y=par(y); if(x==y)return false; if(t[x]<t[y]){ t[x]+=t[y]; t[y]=x; } else{ t[y]+=t[x]; t[x]=y; } return true; } }; int phase,p[4]; UF uf,up[4]; int c[1000000],res; bool b[4]; vector<int>e[1000000]; void Init(int N) { res=N; uf.init(); for(int i=0;i<4;i++){ up[i].init(); } } void Link(int A, int B) { e[A].push_back(B); e[B].push_back(A); if(phase==0){ if(e[A].size()==3){ phase=2; for(int i=0;i<3;i++){ p[i]=e[A][i]; } p[3]=A; for(int i=0;i<4;i++){ b[i]=true; } for(int i=0;i<4;i++){ for(int j=0;j<1000000;j++){ if(p[i]==j)continue; int c=0; for(int k:e[j]){ if(p[i]==k)continue; c++; if(j<k)continue; if(!up[i].uni(j,k)){ b[i]=false; } } if(c>=3)b[i]=false; } } } else if(e[B].size()==3){ phase=2; for(int i=0;i<3;i++){ p[i]=e[B][i]; } p[3]=B; for(int i=0;i<4;i++){ b[i]=true; } for(int i=0;i<4;i++){ for(int j=0;j<1000000;j++){ if(p[i]==j)continue; int c=0; for(int k:e[j]){ if(p[i]==k)continue; c++; if(j<k)continue; if(!up[i].uni(j,k)){ b[i]=false; } } if(c>=3)b[i]=false; } } } else if(!uf.uni(A,B)){ phase=1; res=-uf.t[uf.par(A)]; } } else if(phase==1){ if(e[A].size()==3){ phase=2; for(int i=0;i<3;i++){ p[i]=e[A][i]; } p[3]=A; for(int i=0;i<4;i++){ b[i]=true; } for(int i=0;i<4;i++){ for(int j=0;j<1000000;j++){ if(p[i]==j)continue; int c=0; for(int k:e[j]){ if(p[i]==k)continue; c++; if(j<k)continue; if(!up[i].uni(j,k)){ b[i]=false; } } if(c>=3)b[i]=false; } } } else if(e[B].size()==3){ phase=2; for(int i=0;i<3;i++){ p[i]=e[B][i]; } p[3]=B; for(int i=0;i<4;i++){ b[i]=true; } for(int i=0;i<4;i++){ for(int j=0;j<1000000;j++){ if(p[i]==j)continue; int c=0; for(int k:e[j]){ if(p[i]==k)continue; c++; if(j<k)continue; if(!up[i].uni(j,k)){ b[i]=false; } } if(c>=3)b[i]=false; } } } else if(!uf.uni(A,B)){ phase=3; } } else if(phase==2){ for(int i=0;i<4;i++){ if(!b[i])continue; if(A!=p[i]&&B!=p[i]){ if(!up[i].uni(A,B)){ b[i]=false; } int c=0; for(int j:e[A]){ if(j!=p[i])c++; } if(c>=3)b[i]=false; c=0; for(int j:e[B]){ if(j!=p[i])c++; } if(c>=3)b[i]=false; } } } } int CountCritical() { if(phase==0)return res; if(phase==1)return res; if(phase==2){ res=0; for(int i=0;i<4;i++){ res+=b[i]; } return res; } return 0; }
#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...