Submission #59233

#TimeUsernameProblemLanguageResultExecution timeMemory
59233TadijaSebezParachute rings (IOI12_rings)C++11
52 / 100
4011 ms121440 KiB
#include <stdio.h> #include <vector> #include <algorithm> using namespace std; #define mp make_pair #define pb push_back const int N=1000050; int n; struct DSU { int p[N],c[N],deg[N]; int cyc,my,sz; bool ok; DSU(){} void init(int x) { my=x;cyc=sz=0;ok=1; for(int i=0;i<n;i++) p[i]=i,c[i]=1,deg[i]=0; } int Find(int x){ return x==p[x]?x:p[x]=Find(p[x]);} void Union(int x, int y) { if(x==my || y==my) return; deg[x]++;deg[y]++; if(deg[x]>2 || deg[y]>2) ok=0; x=Find(x);y=Find(y); if(x==y){ cyc++,sz=c[x],ok=0;return;} p[x]=y; c[y]+=c[x]; } } Base,Try[4]; vector<int> E[N]; vector<pair<int,int> > edges; int deg[N],sz; bool mod; void Init(int m){ n=m;Base.init(-1);} void Push() { for(int i=0;i<edges.size();i++) { for(int j=0;j<sz;j++) { Try[j].Union(edges[i].first,edges[i].second); } } } void Link(int a, int b) { deg[a]++; deg[b]++; Base.Union(a,b); E[a].pb(b); E[b].pb(a); edges.pb(mp(a,b)); if(mod) { for(int i=0;i<sz;i++) Try[i].Union(a,b); return; } if(deg[a]>2) { sz=E[a].size()+1; Try[0].init(a); for(int i=0;i<E[a].size();i++) Try[i+1].init(E[a][i]); Push(); mod=1; return; } if(deg[b]>2) { sz=E[b].size()+1; Try[0].init(b); for(int i=0;i<E[b].size();i++) Try[i+1].init(E[b][i]); Push(); mod=1; return; } } int CountCritical() { if(mod) { int ans=0; for(int i=0;i<sz;i++) if(Try[i].ok) ans++; return ans; } if(Base.cyc>1) return 0; if(Base.cyc==1) return Base.sz; return n; }

Compilation message (stderr)

rings.cpp: In function 'void Push()':
rings.cpp:39:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<edges.size();i++)
              ~^~~~~~~~~~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:64:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<E[a].size();i++) Try[i+1].init(E[a][i]);
               ~^~~~~~~~~~~~
rings.cpp:73:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<E[b].size();i++) Try[i+1].init(E[b][i]);
               ~^~~~~~~~~~~~
#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...