제출 #259287

#제출 시각아이디문제언어결과실행 시간메모리
259287Sorting낙하산 고리들 (IOI12_rings)C++17
0 / 100
1340 ms106764 KiB
#include <bits/stdc++.h> using namespace std; const int k_N = 1e6 + 3; int n; int p[k_N], sz[k_N]; vector<int> adj[k_N], adj2[k_N]; int cnt[k_N], req; bool ok; int get_p(int u){ if(p[u] == u) return u; return p[u] = get_p(p[u]); } bool unite(int u, int v){ if(get_p(u) == get_p(v)) return false; if(sz[p[u]] < sz[p[v]]) swap(u, v); sz[p[u]] += sz[p[v]]; p[p[v]] = p[u]; return true; } void Init(int n_){ n = n_; for(int i = 0; i < n; ++i){ p[i] = i; sz[i] = 1; cnt[i] = 0; adj[i].clear(); adj2[i].clear(); } req = 0; ok = true; } bool dfs(int a, int b, int parent = -1){ if(a == b){ cnt[a]++; return true; } for(int to: adj[a]){ if(to == parent) continue; if(dfs(to, b, a)){ cnt[a]++; return true; } } return false; } void Link(int a, int b){ adj2[a].push_back(b); adj2[b].push_back(a); if(adj2[a].size() >= 4 || adj2[b].size() >= 4) ok = false; if(adj2[a].size() == 3){ req++; cnt[a]++; } if(adj2[b].size() == 3){ req++; cnt[b]++; } if(!unite(a, b)){ req++; dfs(a, b); } else{ adj[a].push_back(b); adj[b].push_back(a); } } int CountCritical(){ if(!ok) return 0; int ans = 0; for(int i = 0; i < n; ++i){ int curr_req = cnt[i]; for(int to: adj2[i]) curr_req += (adj2[to].size() == 3); ans += (req == curr_req); } 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...