제출 #760697

#제출 시각아이디문제언어결과실행 시간메모리
760697fatemetmhr낙하산 고리들 (IOI12_rings)C++17
37 / 100
1109 ms87392 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, cnt[maxn5], q[maxn5]; vector <int> adj[maxn5]; inline void calc(){ int l = 0, r = 0; memset(mark, false, sizeof mark); for(int i = 0; i < n; i++){ cnt[i] = adj[i].size(); if(cnt[i] < 2){ mark[i] = true; q[r++] = i; } } while(l < r){ int v = q[l++]; for(auto u : adj[v]) if(!mark[u]){ cnt[u]--; if(cnt[u] < 2){ mark[u] = true; q[r++] = u; } } } cynum = 0; for(int i = 0; i < n; i++) cynum += (!mark[i]); memset(mark, false, sizeof mark); } 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; a = get_par(a); b = get_par(b); if(a == b){ noans = true; if(cy) morecy = true; else{ cy = true; if(remver == -1) calc(); } 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 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 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); return num; } if(!cy) return n; if(morecy) return 0; return cynum; }
#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...