Submission #578873

#TimeUsernameProblemLanguageResultExecution timeMemory
578873AngusWongParachute rings (IOI12_rings)C++17
20 / 100
4093 ms101704 KiB
#include <bits/stdc++.h> using namespace std; const int N=1e6+1; int n, viss, cnt[N], dsu[N], sz[N]; vector<int> v[N], v2; set<int> crit, tmp; int vis[N], par[N]; vector<int> cyc; int find(int x){ return dsu[x]==x? x: dsu[x]=find(dsu[x]); } void join(int x, int y){ x=find(x), y=find(y); sz[y]+=sz[x]; dsu[x]=y; } void Init(int N_) { n=N_, viss=0; for (int i=0; i<n; i++){ cnt[i]=0; dsu[i]=i, sz[i]=1; v[i].clear(); crit.insert(i); vis[i]=0, par[i]=-1; } cyc.clear(); } void setcrit(vector<int> v){ tmp.clear(); for (int i: v){ if (crit.find(i)!=crit.end()) tmp.insert(i); } crit=tmp; } void dfs(int x, int st, int ed, int prev=-1){ vis[x]=viss, par[x]=prev; if (x==ed){ int t=x; while (t!=st){ cyc.push_back(t); t=par[t]; assert(t!=-1); } cyc.push_back(st); setcrit(cyc); return; } for (int i: v[x]){ if (vis[i]!=viss){ dfs(i, st, ed, x); continue; } } vis[x]=2; } void Link(int A, int B) { cnt[A]=min(cnt[A]+1, 4), cnt[B]=min(cnt[B]+1, 4); if (find(A)!=find(B)) join(A, B); else{ viss++; cyc.clear(); dfs(A, A, B); } v[A].push_back(B); v[B].push_back(A); if (cnt[A]==3){ v2=v[A]; v2.push_back(A); setcrit(v2); }else if (cnt[A]==4) setcrit({A}); if (cnt[B]==3){ v2=v[B]; v2.push_back(B); setcrit(v2); }else if (cnt[B]==4) setcrit({B}); } int CountCritical() { return crit.size(); }
#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...