Submission #526536

#TimeUsernameProblemLanguageResultExecution timeMemory
526536jwvg0425Parachute rings (IOI12_rings)C++17
20 / 100
4048 ms49004 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]; void Link(int a, int b) { edge[a].push_back(b); edge[b].push_back(a); } bool isCritical(int x) { vector<int> deg(n); for (int i = 0; i < n; i++) { deg[i] = edge[i].size(); for (auto& e : edge[i]) { if (e == x) deg[i]--; } } // 전부 deg 2 이하인지 확인 for (int i = 0; i < n; i++) { if (i == x) continue; if (deg[i] > 2) return false; } // deg 1에서 시작해서 전부 방문가능한지 확인(chain) vector<bool> vis(n); queue<int> q; for (int i = 0; i < n; i++) { if (i == x) continue; if (deg[i] == 0) vis[i] = true; if (deg[i] != 1) continue; q.push(i); vis[i] = true; } while (!q.empty()) { auto now = q.front(); q.pop(); for (auto& e : edge[now]) { if (e == x || vis[e]) continue; vis[e] = true; q.push(e); } } for (int i = 0; i < n; i++) { if (i == x) continue; if (!vis[i]) return false; } return true; } int CountCritical() { int ans = 0; for (int i = 0; i < n; i++) { if (isCritical(i)) ans++; } 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...