Submission #1015565

#TimeUsernameProblemLanguageResultExecution timeMemory
1015565parsadox2Parachute rings (IOI12_rings)C++17
100 / 100
1222 ms231880 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int ans , n , deg[N]; bool flg; vector <int> adj[N]; struct Graph{ int vert , par[N] , d[N]; bool ok , marked[N]; vector <int> all[N]; void Dfs(int v , int p = -1) { marked[v] = true; par[v] = (p == -1 ? v : par[p]); int D = (p != -1); for(auto u : adj[v]) if(u != vert) { if(!marked[u]) { D++; Dfs(u , v); } else if(u != p) ok = false; } if(D > 2) ok = false; d[v] = D; } int root(int v) { return (par[v] == v ? v : par[v] = root(par[v])); } void Build() { ok = true; marked[vert] = true; for(int i = 0 ; i < n ; i++) if(!marked[i]) Dfs(i); } void Add(int a , int b) { if(a == vert || b == vert) return; int ra = root(a) , rb = root(b); if(d[a] > 1 || d[b] > 1 || ra == rb) { ok = false; return; } par[rb] = ra; d[a]++; d[b]++; } } graph[5]; struct DSU{ int sz[N] , par[N]; void Build() { for(int i = 0 ; i < n ; i++) { par[i] = i; sz[i] = 1; } } int root(int v) { return (par[v] == v ? v : par[v] = root(par[v])); } void Merge(int a , int b) { deg[a]++; deg[b]++; adj[a].push_back(b); adj[b].push_back(a); if(deg[a] < deg[b]) swap(a , b); int ra = root(a) , rb = root(b); //cout << a << " --- " << b << " " << ra << " " << rb << endl; if(deg[a] == 3) { graph[0].vert = a; for(int i = 1 ; i <= 3 ; i++) graph[i].vert = adj[a][i - 1]; for(int i = 0 ; i < 4 ; i++) graph[i].Build(); flg = true; return; } if(ra == rb) { ans = (ans == n ? sz[ra] : 0); return; } par[rb] = ra; sz[ra] += sz[rb]; } } dsu; void Init(int x) { n = x; ans = x; dsu.Build(); } void Link(int a , int b) { if(!flg) dsu.Merge(a , b); else { for(int i = 0 ; i < 4 ; i++) graph[i].Add(a , b); } } int CountCritical() { if(!flg) return ans; else { int cnt = 0; for(int i = 0 ; i < 4 ; i++) cnt += graph[i].ok; return cnt; } }
#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...