제출 #1320266

#제출 시각아이디문제언어결과실행 시간메모리
1320266madamadam3수천개의 섬 (IOI22_islands)C++20
6.75 / 100
120 ms14632 KiB
#include "islands.h" #include <bits/stdc++.h> using namespace std; using vi = vector<int>; using pi = pair<int, int>; int n, m; vector<vi> adj; vi istate; variant<bool, vi> find_journey(int N, int M, vi U, vi V) { n = N; m = M; istate.assign(n, 0); adj.resize(n); map<pi, int> ec; for (int i = 0; i < m; i++) { ec[{U[i], V[i]}]++; adj[U[i]].push_back(i); adj[V[i]].push_back(i); } auto find = [&](int u, int v, int skip = -1) { for (int i = 0; i < m; i++) { if (U[i] == u && V[i] == v && i != skip) return i; } return -1; }; auto get_case1 = [&](int u, int p) { for (auto e : adj[u]) { int v = U[e] == u ? V[e] : U[e]; if (v == p) continue; if (ec[{u, v}] >= 2 && ec[{v, u}] >= 1) { int a = find(u, v), c = find(v, u); int b = find(u, v, a); return vector<int>({a, c, b, a, c, b}); } } return vector<int>({}); }; if (n == 2) { auto c1 = get_case1(0, -1); if (c1.empty()) return false; else return c1; } vector<int> pre, maneuver, post; set<int> vis; auto dfs_c1 = [&](auto &&self, int u, int p) { auto c1 = get_case1(u, p); if (!c1.empty()) { maneuver = c1; return true; } vis.insert(u); for (auto e : adj[u]) { int v = U[e] == u ? V[e] : U[e]; if (v == p) continue; if (vis.count(v)) continue; if (self(self, v, u)) { post.push_back(e); return true; } } return false; }; if (dfs_c1(dfs_c1, 0, -1)) { pre = post; reverse(pre.begin(), pre.end()); for (auto &el : maneuver) pre.push_back(el); for (auto &el : post) pre.push_back(el); return pre; } int timer = 0; vis.clear(); vi tin(n+1, -1); auto dfs_c2 = [&](auto &&self, int u, int p) { vis.insert(u); tin[u] = timer++; for (auto e : adj[u]) { int v = U[e] == u ? V[e] : U[e]; if (v == p) { if (ec[{u, v}] >= 2 && ec[{v, u}] >= 2) return true; else continue; } if (!(ec[{u, v}] > 0 && ec[{v, u}] > 0)) continue; if (vis.count(v)) { if (tin[v] < tin[u]) return true; else continue; } if (self(self, v, u)) { return true; } } return false; }; if (dfs_c2(dfs_c2, 1, -1)) return true; // int a = find(0, 1), b = find(1, 0), c = find(1, 2), d = find(2, 1), e = find(2, 0), f = find(0, 2); // return vector<int>({a, c, e, f, d, b, e, c, a, b, d, f}); return false; }
#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...