Submission #357265

#TimeUsernameProblemLanguageResultExecution timeMemory
357265daniel920712Parachute rings (IOI12_rings)C++14
37 / 100
3424 ms74900 KiB
#include <stdio.h> #include <stdlib.h> #include <vector> #include <set> using namespace std; int N; int who; vector < int > Next[1000005],tt; int deg[1000005]; bool have[1000005]; int ok=1; int x=0,y=0; set < int > xxx; void Init(int N_) { N = N_; } void Link(int A, int B) { Next[A].push_back(B); Next[B].push_back(A); deg[A]++; deg[B]++; } void F(int here) { y++; int t=0; have[here]=1; for(auto i:Next[here]) if(!have[i]&&i!=who) F(i); } int CountCritical() { int ans=0,now=0; int i,j; tt.clear(); xxx.clear(); for(i=0;i<N;i++) { if(deg[i]>=3) { tt.push_back(i); now++; } } if(now==0) { x=y=0; ok=1; who=-1; for(j=0;j<N;j++) have[j]=0; for(j=0;j<N;j++) { if(deg[j]==0) have[j]=1; if(deg[j]==1&&!have[j]) F(j); } for(j=0;j<N;j++) { if(!have[j]) { who=-1; x++; y=0; F(j); } ans+=x; } if(x==0) return N; if(x==1) return y; return 0; } else if(now==1) { //printf("bb %d\n",ans); for(auto i:tt) { ok=1; who=i; for(auto j:Next[i]) deg[j]--; for(j=0;j<N;j++) have[j]=0; have[i]=1; for(j=0;j<N;j++) { if(deg[j]==0) have[j]=1; if(deg[j]==1&&!have[j]) F(j); if(deg[j]>=3&&i!=j) ok=0; } for(j=0;j<N;j++) if(!have[j]) ok=0; for(auto j:Next[i]) deg[j]++; ans+=ok; } if(deg[tt[0]]==3) { for(auto i:Next[tt[0]]) { ok=1; who=i; for(auto j:Next[i]) deg[j]--; for(j=0;j<N;j++) have[j]=0; have[i]=1; for(j=0;j<N;j++) { if(deg[j]==0) have[j]=1; if(deg[j]==1&&!have[j]) F(j); if(deg[j]>=3&&i!=j) ok=0; } for(j=0;j<N;j++) if(!have[j]) ok=0; for(auto j:Next[i]) deg[j]++; ans+=ok; } } return ans; } else if(now==2) { for(auto i:tt) { ok=1; who=i; for(auto j:Next[i]) deg[j]--; for(j=0;j<N;j++) have[j]=0; have[i]=1; for(j=0;j<N;j++) { if(deg[j]==0) have[j]=1; if(deg[j]==1&&!have[j]) F(j); if(deg[j]>=3&&i!=j) ok=0; } for(j=0;j<N;j++) if(!have[j]) ok=0; for(auto j:Next[i]) deg[j]++; if(ok) xxx.insert(i); } if(deg[tt[0]]==3) { for(auto i:Next[tt[0]]) { ok=1; who=i; for(auto j:Next[i]) deg[j]--; for(j=0;j<N;j++) have[j]=0; have[i]=1; for(j=0;j<N;j++) { if(deg[j]==0) have[j]=1; if(deg[j]==1&&!have[j]) F(j); if(deg[j]>=3&&i!=j) ok=0; } for(j=0;j<N;j++) if(!have[j]) ok=0; for(auto j:Next[i]) deg[j]++; if(ok) xxx.insert(i); } } if(deg[tt[1]]==3) { for(auto i:Next[tt[1]]) { ok=1; who=i; for(auto j:Next[i]) deg[j]--; for(j=0;j<N;j++) have[j]=0; have[i]=1; for(j=0;j<N;j++) { if(deg[j]==0) have[j]=1; if(deg[j]==1&&!have[j]) F(j); if(deg[j]>=3&&i!=j) ok=0; } for(j=0;j<N;j++) if(!have[j]) ok=0; for(auto j:Next[i]) deg[j]++; if(ok) xxx.insert(i); } } return xxx.size(); } else return 0; }

Compilation message (stderr)

rings.cpp: In function 'void F(int)':
rings.cpp:29:9: warning: unused variable 't' [-Wunused-variable]
   29 |     int t=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...