Submission #4194

#TimeUsernameProblemLanguageResultExecution timeMemory
4194cki86201Parachute rings (IOI12_rings)C++98
100 / 100
1503 ms75104 KiB
int N; const int MN = 1000010; struct str{ int p[MN],r[MN]; int deg[MN]; int px; bool ch; void init(int x){ int i; for(i=0;i<N;i++){deg[i]=0,p[i]=i,r[i]=1;} px=x,ch=true; } int Find(int x){ while(x!=p[x])x=p[x]; return x; } bool Union(int x,int y){ deg[x]++,deg[y]++; int a=Find(x),b=Find(y); if(a==b)return true; if(r[a]>r[b]){p[b]=a,r[a]+=r[b],r[b]=0;} else{p[a]=b,r[b]+=r[a],r[a]=0;} return false; } }ring[5]; int ans; int cnt; bool flag_3; bool flag_cycle; int st[MN],en[MN<<1],next[MN<<1]; int in[MN][2]; void addedge(int s,int d,int c) { next[c]=st[s]; st[s]=c; en[c]=d; } void Init(int N_){ ans = N = N_; ring[0].init(0); } void make_ring(int arr[]) { int i,j; for(i=0;i<4;i++){ ring[i].init(arr[i]); for(j=1;j<=cnt;j++){ if(in[j][0]==arr[i]||in[j][1]==arr[i])continue; if(ring[i].Union(in[j][0],in[j][1]))ring[i].ch=false; if(ring[i].deg[in[j][0]]>=3 || ring[i].deg[in[j][1]]>=3)ring[i].ch=false; } } } void Link(int A, int B){ cnt++; addedge(A,B,2*cnt); addedge(B,A,2*cnt+1); in[cnt][0]=A,in[cnt][1]=B; if(flag_3){ int i; for(i=0;i<4;i++){ if(A!=ring[i].px && B!=ring[i].px){ if(ring[i].Union(A,B))ring[i].ch=false; if(ring[i].deg[A]>=3 || ring[i].deg[B]>=3)ring[i].ch=false; } } return; } if(ring[0].Union(A,B)){ if(flag_cycle)ans=0; else{ int ta=ring[0].Find(A); ans=ring[0].r[ta]; flag_cycle=1; } } if(ring[0].deg[A]>=3){ int arr[5]={A}; int i,tmp=1; for(i=st[A];i;i=next[i]){ arr[tmp++]=en[i]; } make_ring(arr); flag_3 = true; } else if(ring[0].deg[B]>=3){ int arr[5]={B}; int i,tmp=1; for(i=st[B];i;i=next[i]){ arr[tmp++]=en[i]; } make_ring(arr); flag_3 = true; } } int CountCritical(){ if(flag_3){ int i,ret=0; for(i=0;i<4;i++){ if(ring[i].ch)ret++; } return ret; } 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...