Submission #270114

#TimeUsernameProblemLanguageResultExecution timeMemory
270114shayan_pParachute rings (IOI12_rings)C++14
100 / 100
1850 ms111832 KiB
// And you curse yourself for things you never done #include<bits/stdc++.h> #define F first #define S second #define PB push_back #define sz(s) int((s).size()) #define bit(n,k) (((n)>>(k))&1) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 1e6 + 10, mod = 1e9 + 7, inf = 1e9 + 10; struct dsu{ int par[maxn]; void init(int n){ fill(par, par + n, -1); } int fnd(int u){ return par[u] < 0 ? u : par[u] = fnd(par[u]); } bool mrg(int a, int b){ if( (a = fnd(a)) == (b = fnd(b)) ) return 0; if(par[a] > par[b]) swap(a, b); par[a]+= par[b]; par[b] = a; return 1; } }; struct solver{ bool ok; int d[maxn]; dsu ds; void init(int n){ ok = 1; ds.init(n); fill(d, d + n, 0); } void add(int a, int b){ if((++d[a]) > 2 || (++d[b]) > 2) ok = 0; if(!ds.mrg(a, b)) ok = 0; } }; solver sol[4]; dsu ds; vector<pii> ed; vector<int> imps; vector<int> v[maxn]; int n; int CYC; bool bad; void Init(int n){ ::n = n; for(int i = 0; i < n; i++) v[i].clear(); imps.clear(); ed.clear(); for(int i = 0; i < 4; i++) sol[i].init(n); ds.init(n); CYC = -1; bad = 0; } void Link(int a, int b){ ed.PB({a, b}); v[a].PB(b), v[b].PB(a); if(sz(v[a]) < sz(v[b])) swap(a, b); if(imps.empty() == 0){ for(int i = 0; i < 4; i++){ if(a != imps[i] && b != imps[i]) sol[i].add(a, b); } } if(imps.empty() && sz(v[a]) > 2){ assert(sz(v[a]) == 3); imps = v[a]; imps.PB(a); for(pii p : ed){ for(int i = 0; i < 4; i++){ if(p.F != imps[i] && p.S != imps[i]) sol[i].add(p.F, p.S); } } } if(!ds.mrg(a, b)){ if(CYC != -1) bad = 1; CYC = -ds.par[ ds.fnd(a) ]; } } int CountCritical(){ int ans = 0; if(imps.empty()){ if(bad == 0) ans = CYC == -1 ? n : CYC; } else{ for(int i = 0; i < 4; i++) ans+= sol[i].ok; } 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...