제출 #1253230

#제출 시각아이디문제언어결과실행 시간메모리
1253230TIN세계 지도 (IOI25_worldmap)C++20
22 / 100
15 ms2116 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;
	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::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;
			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;
		int x, y;
		x = 0, y = 0;
		for (int i = 0; i < M; i++) {
			if (x >= 2 * N) break;
			if (A[i] == 0 || B[i] == 0) continue;
			ans[x][y] = A[i] + 1;
			ans[x][y + 1] = B[i] + 1;
			y += 3;
			if (y + 1 >= 2 * N) {
				x += 2;
				y = 0;
			}
		}
		return ans;
	}

	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...