Submission #1222031

#TimeUsernameProblemLanguageResultExecution timeMemory
1222031totoroThousands Islands (IOI22_islands)C++20
22.75 / 100
1094 ms1907268 KiB
#include "islands.h" #include <iostream> #include <map> #include <variant> #include <vector> std::variant<bool, std::vector<int>> find_journey_connected(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> original_labels); std::variant<bool, std::vector<int>> find_journey(int N, int M, std::vector<int> U, std::vector<int> V) { std::vector<std::vector<int>> canoesfrom(N); for (int i = 0; i < M; ++i) canoesfrom[U[i]].push_back(i); std::vector<bool> seen(N); std::vector<int> stack = {0}; while (!stack.empty()) { int node = stack.back(); stack.pop_back(); if (seen[node]) continue; seen[node] = true; for (int i : canoesfrom[node]) { stack.push_back(V[i]); } } std::vector<int> newu, newv, original_labels; int newm = 0; for (int i = 0; i < N; ++i) { if (!seen[i]) continue; for (int out : canoesfrom[i]) { newu.push_back(U[out]); newv.push_back(V[out]); original_labels.push_back(out); ++newm; } } return find_journey_connected(N, newm, newu, newv, original_labels); } // everything except line case works std::variant<bool, std::vector<int>> find_journey_connected(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> original_labels) { std::vector<std::vector<int>> adj(N); for (int i = 0; i < M; ++i) { adj[U[i]].push_back(i); } std::vector<int> ans; auto dfs = [&](int node, int waka, auto dfs) -> bool { std::vector<int> goodadj; for (int to : adj[node]) { if (waka != -1 && (original_labels[to] & (-2)) == (original_labels[waka] & (-2))) continue; // don't go back goodadj.push_back(to); } if (goodadj.size() >= 2) { ans.push_back(original_labels[goodadj[0]]); ans.push_back(original_labels[goodadj[0]] ^ 1); ans.push_back(original_labels[goodadj[1]]); ans.push_back(original_labels[goodadj[1]] ^ 1); ans.push_back(original_labels[goodadj[0]] ^ 1); ans.push_back(original_labels[goodadj[0]]); ans.push_back(original_labels[goodadj[1]] ^ 1); ans.push_back(original_labels[goodadj[1]]); return true; } for (int to : goodadj) { ans.push_back(original_labels[to]); if (dfs(V[to], to, dfs)) { ans.push_back(original_labels[to]); return true; } ans.pop_back(); } return false; }; bool exists = dfs(0, -1, dfs); if (!exists) return false; 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...