제출 #633116

#제출 시각아이디문제언어결과실행 시간메모리
633116tutis수천개의 섬 (IOI22_islands)C++17
31 / 100
34 ms4420 KiB
#include "islands.h" #include <variant> #include <vector> #include <bits/stdc++.h> using namespace std; variant<bool, vector<int>> find_journey( int N, int M, vector<int> U, vector<int> V) { if (N == 2) { vector<int>a; vector<int>b; for (int i = 0; i < M; i++) if (U[i] == 0 && V[i] == 1) a.push_back(i); else b.push_back(i); if (a.size() >= 2 && b.size() >= 1) return vector<int>({a[0], b[0], a[1], a[0], b[0], a[1]}); return false; } { int x = -1; int y = -1; int z = -1; int t = -1; for (int i = 0; i < M; i++) if (U[i] == 0 && V[i] == 1) x = i; else if (U[i] == 1 && V[i] == 0) y = i; else if (U[i] == 0 && V[i] == 2) z = i; else if (U[i] == 2 && V[i] == 0) t = i; if (min({x, y, z, t}) >= 0) return vector<int>({x, y, z, t, y, x, t, z}); } { vector<pair<int, int>>adj[N]; for (int i = 0; i + 1 < M; i += 2) if (V[i + 1] == U[i] && V[i] == U[i + 1]) { adj[U[i]].push_back({V[i], i}); adj[V[i]].push_back({U[i], i + 1}); } vector<bool> vis(N, false); vector<int>c; vector<int>xx; function<void(int)>dfs = [&](int i)->void { if (vis[i]) return; vis[i] = true; vector<int>V; for (pair<int, int> jj : adj[i]) { int j = jj.first; if (vis[j] == false) V.push_back(jj.second); } if (V.size() >= 2) { vector<int>a = xx; c = xx; c.push_back(V[0]); c.push_back(V[0] ^ 1); c.push_back(V[1]); c.push_back(V[1] ^ 1); c.push_back(V[0] ^ 1); c.push_back(V[0]); c.push_back(V[1] ^ 1); c.push_back(V[1]); reverse(a.begin(), a.end()); for (int i : a) c.push_back(i); } else for (pair<int, int> jj : adj[i]) { int j = jj.first; if (vis[j] == false) { xx.push_back(jj.second); dfs(j); xx.pop_back(); if (!c.empty()) return; } } }; dfs(0); if (!c.empty()) return c; } { vector<pair<int, int>>adj[N]; for (int i = 0; i + 1 < M; i += 2) if (U[i + 1] == U[i] && V[i] == V[i + 1]) adj[U[i]].push_back({V[i], i}); vector<bool> vis(N, false); vector<int>c; vector<int>xx; vector<int> D(N); function<void(int, int)>dfs = [&](int i, int d)->void { if (vis[i]) return; D[i] = d; vis[i] = true; for (pair<int, int> jj : adj[i]) { int j = jj.first; if (vis[j] == true) { xx.push_back(jj.second); vector<int>a, b; for (int i = 0; i < D[j]; i++) a.push_back(xx[i]); for (int i = D[j]; i < (int)xx.size(); i++) b.push_back(xx[i]); for (int i : a) c.push_back(i); for (int i : b) c.push_back(i); for (int i : b) c.push_back(i ^ 1); reverse(b.begin(), b.end()); reverse(a.begin(), a.end()); for (int i : b) c.push_back(i); for (int i : b) c.push_back(i ^ 1); for (int i : a) c.push_back(i); return; } } for (pair<int, int> jj : adj[i]) { int j = jj.first; if (vis[j] == false) { xx.push_back(jj.second); dfs(j, d + 1); xx.pop_back(); if (!c.empty()) return; } } }; dfs(0, 0); if (!c.empty()) return c; } 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...