Submission #1253331

#TimeUsernameProblemLanguageResultExecution timeMemory
1253331TINWorld Map (IOI25_worldmap)C++20
72 / 100
81 ms9544 KiB
#include "worldmap.h" #include <functional> std::vector<std::vector<int>> create_map(int N, int M, std::vector<int> A, std::vector<int> B) { std::vector<std::vector<int>> ans(2 * N, std::vector<int>(2 * N, 1)); for (auto& x : A) --x; for (auto& x : B) --x; std::vector<std::vector<int>> adj(N, std::vector<int>()); for (int i = 0; i < M; i++) adj[A[i]].push_back(B[i]), adj[B[i]].push_back(A[i]); std::vector<int> euler_tour; if (M == N - 1) { bool sub1 = true; for (int i = 0; i + 1 < N; i++) if (A[i] != i || B[i] != i + 1) sub1 = false; if (sub1) { for (int i = 0; i < 2 * N; i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = N; for (int i = 1; i < N; i++) for (int j = 0; j < 2 * N; j++) ans[i - 1][j] = i; } else { for (int i = 0; i < 2 * N; i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = 1; std::function<void(int, int)> DFS; DFS = [&](int u, int par) { euler_tour.push_back(u + 1); for (int v : adj[u]) { if (v ^ par) { DFS(v, u); euler_tour.push_back(u + 1); } } }; DFS(0, 0); for (int i = 0; i < (int) euler_tour.size(); i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = euler_tour[i]; } return ans; } if (M == N * (N - 1) / 2) { for (int i = 0; i < N; i++) { for (int j = 0; j < 2 * N; j++) { ans[i * 2][j] = i + 1; ans[i * 2 + 1][j] = (j + 1 <= N ? j + 1 : N); } } return ans; } bool sub4 = true; std::vector<bool> ok(N, false); for (int i = 0; i < M; i++) if (A[i] == 0 || B[i] == 0) ok[A[i] + B[i]] = true; for (int i = 1; i < N; i++) if (!ok[i]) sub4 = false; if (sub4) { for (int i = 0; i < 2 * N; i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = 1; for (int i = 0; i < N; i++) { int row = i * 2; for (int j = 0; j < 2 * N; j++) ans[row][j] = i + 1; for (int j = 0; j < (int) adj[i].size(); j++) ans[row][j * 2] = adj[i][j] + 1; } return ans; } std::vector<bool> visited(N, false); std::function<void(int)> DFS; DFS = [&](int u) { visited[u] = true; euler_tour.push_back(u + 1); for (int v : adj[u]) { if (!visited[v]) { DFS(v); euler_tour.push_back(u + 1); } } }; DFS(0); ans.assign(4 * N, std::vector<int>(4 * N, 1)); int row = 0; visited.assign(N, false); for (int i = 0; i < (int) euler_tour.size(); i++) { int u = euler_tour[i]; if (visited[u - 1]) { for (int j = 0; j < 4 * N; j++) ans[row][j] = u; ++row; continue; } for (int j = 0; j < 4 * N; j++) ans[row][j] = ans[row + 1][j] = ans[row + 2][j] = u; for (int j = 0; j < (int) adj[u - 1].size(); j++) ans[row + 1][j * 2] = adj[u - 1][j] + 1; row += 3; visited[u - 1] = true; } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...