제출 #1067171

#제출 시각아이디문제언어결과실행 시간메모리
1067171j_vdd16수천개의 섬 (IOI22_islands)C++17
9.10 / 100
43 ms5460 KiB
#include "islands.h" #include <variant> #include <algorithm> #include <bitset> #include <cstdint> #include <cstring> #include <iostream> #include <limits.h> #include <math.h> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <string> #include <vector> //#define int long long #define loop(X, N) for(int X = 0; X < (N); X++) #define all(V) V.begin(), V.end() #define rall(V) V.rbegin(), V.rend() using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> ii; typedef vector<ii> vii; typedef vector<vector<ii>> vvii; typedef vector<bool> vb; typedef vector<vector<bool>> vvb; typedef uint64_t u64; typedef int64_t i64; int n, m; vvii adj; vb vis; vi depths; bool success = false; int counter = 0; vii inOut; int dfs(int node, int d, int parent) { if (node == parent) return 0; if (vis[node]) { return 1; } vis[node] = true; depths[node] = d; inOut[node].first = counter++; int count = 0; for (auto [child, idx] : adj[node]) { if (child == parent) continue; int res = dfs(child, d + 1, node); count += res; } if (count >= 2) success = true; inOut[node].second = counter++; return 1; } bool isAncestor(int a, int b) { return inOut[a].first <= inOut[b].first && inOut[b].first <= inOut[a].second; } vi parents; vi succesPath; int dfs2(int node, int parent, vi path) { if (vis[node]) { return 1; } parents[node] = parent; vis[node] = true; int count = 0; vi validIndices; for (auto [child, idx] : adj[node]) { if (child == parent) continue; vi childPath = path; childPath.push_back(idx); int res = dfs2(child, node, path); if (res) { count += res; validIndices.push_back(idx); } } if (count >= 2) { success = true; succesPath = path; succesPath.push_back(validIndices[0]); succesPath.push_back(validIndices[0] ^ 1); succesPath.push_back(validIndices[1]); succesPath.push_back(validIndices[1] ^ 1); for (int i = succesPath.size() - 4 - 1; i >= 0; i++) { succesPath.push_back(succesPath[i] ^ 1); } } return 1; } std::variant<bool, std::vector<int>> find_journey(int N, int M, vi U, vi V) { n = N; m = M; adj = vvii(n); loop(i, m) { adj[U[i]].push_back({V[i], i}); } // if (n >= 3) { // int n1 = adj[0][0].first; // int n2 = adj[0][1].first; // return vi{adj[0][0].second, adj[n1][0].second, adj[0][1].second, adj[n2][0].second, adj[n1][0].second, adj[0][0].second, adj[n2][0].second, adj[0][1].second }; // } // return false; depths = vi(n); counter = 0; inOut = vii(n); vis = vb(n); success = false; parents = vi(n); dfs2(0, -1, {}); // vis = vb(n); // marked = vi(n); // dfs2(0); if (success) { return succesPath; } return false; // return false; // return success; }
#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...