Submission #760703

#TimeUsernameProblemLanguageResultExecution timeMemory
760703fatemetmhrParachute rings (IOI12_rings)C++17
100 / 100
1006 ms83408 KiB
// ~ Be Name Khoda ~ // #include <bits/stdc++.h> //#pragma GCC optimize ("O3") //#pragma GCC target("avx2") //#pragma GCC optimize("unroll-loops,Ofast") using namespace std; typedef long long ll; #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define fi first #define se second const int maxn = 1e6 + 10; const int maxn5 = 1e6 + 10; const int maxnt = 1.2e6 + 10; const int maxn3 = 1e3 + 10; const int mod = 1e9 + 7; const ll inf = 1e18; int n; bool found = false; bool cy = false, morecy = false, mark[maxn5]; int cynum = 0; vector <int> adj[maxn5]; struct _dsu{ int remver, par[maxn5]; bool noans; _dsu(){ remver = -1; noans = false; memset(par, -1, sizeof par); } int get_par(int a){return par[a] < 0 ? a : par[a] = get_par(par[a]);} inline void add(int a, int b){ if(a == remver || b == remver || a == b) return; //if(remver == 3) // cout << "here " << a << ' ' << b << endl; a = get_par(a); b = get_par(b); //if(remver == 3) // cout << "and " << a << ' ' << b << endl; if(a == b){ noans = true; if(cy) morecy = true; else{ cy = true; cynum = -par[a]; } return; } if(-par[a] < -par[b]) swap(a, b); par[a] += par[b]; par[b] = a; } } dsu[6]; void Init(int N_) { n = N_; } void Link(int a, int b){ adj[a].pb(b); adj[b].pb(a); dsu[0].add(a, b); if(found) for(int i = 1; i < 5; i++) dsu[i].add(a, b); if(!found && adj[a].size() == 3){ found = true; dsu[1].remver = a; for(int v = 0; v < n; v++) for(auto u : adj[v]) if(u < v) dsu[1].add(v, u); for(int i = 0; i < 3; i++){ dsu[i + 2].remver = adj[a][i]; for(int v = 0; v < n; v++) for(auto u : adj[v]) if(u < v) dsu[i + 2].add(v, u); } } else if(adj[a].size() == 3){ mark[a] = mark[adj[a][0]] = mark[adj[a][1]] = mark[adj[a][2]] = true; for(int i = 1; i < 5; i++) if(!mark[dsu[i].remver]) dsu[i].noans = true; mark[a] = mark[adj[a][0]] = mark[adj[a][1]] = mark[adj[a][2]] = false; } else if(adj[a].size() == 4){ for(int i = 1; i < 5; i++) if(dsu[i].remver != a) dsu[i].noans = true; } swap(a, b); if(!found && adj[a].size() == 3){ found = true; dsu[1].remver = a; for(int v = 0; v < n; v++) for(auto u : adj[v]) if(u < v) dsu[1].add(v, u); for(int i = 0; i < 3; i++){ dsu[i + 2].remver = adj[a][i]; for(int v = 0; v < n; v++) for(auto u : adj[v]) if(u < v) dsu[i + 2].add(v, u); } } else if(adj[a].size() == 3){ mark[a] = mark[adj[a][0]] = mark[adj[a][1]] = mark[adj[a][2]] = true; for(int i = 1; i < 5; i++) if(!mark[dsu[i].remver]) dsu[i].noans = true; mark[a] = mark[adj[a][0]] = mark[adj[a][1]] = mark[adj[a][2]] = false; } else if(adj[a].size() == 4){ for(int i = 1; i < 5; i++) if(dsu[i].remver != a) dsu[i].noans = true; } } int CountCritical() { if(found){ int num = 0; for(int i = 1; i < 5; i++){ num += (!dsu[i].noans); //cout << i << ' ' << dsu[i].noans << ' ' << dsu[i].remver << endl; } return num; } if(!cy) return n; if(morecy) return 0; return cynum; } /* 4 7 1 3 1 2 2 3 0 3 0 2 0 1 -1 */
#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...