Submission #526585

#TimeUsernameProblemLanguageResultExecution timeMemory
526585jwvg0425낙하산 고리들 (IOI12_rings)C++17
37 / 100
1263 ms110316 KiB
#include <stdio.h> #include <vector> #include <queue> #include <algorithm> #include <iostream> #include <string> #include <bitset> #include <map> #include <set> #include <tuple> #include <string.h> #include <math.h> #include <random> #include <functional> #include <assert.h> #include <math.h> #define all(x) (x).begin(), (x).end() #define xx first #define yy second using namespace std; template<typename T, typename Pr = less<T>> using pq = priority_queue<T, vector<T>, Pr>; using i64 = long long int; using ii = pair<int, int>; using ii64 = pair<i64, i64>; int n; void Init(int n_) { n = n_; } vector<int> edge[1000005]; int order[1000005]; int t = 0; int comp[1000005]; int par[1000005]; int up[1000005]; vector<int> s; void Link(int a, int b) { edge[a].push_back(b); edge[b].push_back(a); } void dfs(int x) { s.push_back(x); t++; order[x] = t; up[x] = order[x]; comp[x] = s.size() == 1 ? 0 : 1; for (auto& e : edge[x]) { if (order[e] == 0) { par[e] = x; dfs(e); if (up[e] >= order[x]) comp[x]++; } if (e != par[x]) up[x] = min(up[x], up[e]); } } int getDegree(int x, int off = 0) { return min((int)edge[x].size() - off, 3); } int solve(int x) { s.clear(); dfs(x); vector<int> cnt(6); for (auto& si : s) cnt[getDegree(si)]++; if (cnt[0] != 0 || (cnt[1] == 2 && cnt[3] == 0)) return 0; int res = 0; for (auto& si : s) { cnt[getDegree(si)]--; for (auto& e : edge[si]) { cnt[getDegree(e)]--; cnt[getDegree(e, 1)]++; } if (comp[si] * 2 == cnt[1] + cnt[0] * 2 && cnt[3] == 0) res++; for (auto& e : edge[si]) { cnt[getDegree(e)]++; cnt[getDegree(e, 1)]--; } cnt[getDegree(si)]++; } return res; } int CountCritical() { for (int i = 0; i < n; i++) { order[i] = comp[i] = 0; par[i] = -1; up[i] = 987654321; } t = 0; vector<int> cx; int res = 0; for (int i = 0; i < n && cx.size() < 2; i++) { if (order[i] != 0) continue; int now = solve(i); if (now == 0) { res += s.size(); continue; } cx.push_back(now); } if (cx.size() >= 2) return 0; if (cx.empty()) return res; return cx[0]; }
#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...