제출 #1263657

#제출 시각아이디문제언어결과실행 시간메모리
1263657gelastropod세계 지도 (IOI25_worldmap)C++20
15 / 100
33 ms4424 KiB
#include "worldmap.h"

#include <bits/stdc++.h>
using namespace std;

int N, numchosen;
vector<vector<int>> adjlist, nadjlist;
vector<vector<int>> ans;
vector<int> visited;
vector<int> selected;
vector<int> null = {};

vector<vector<pair<int, vector<int>>>> mem;

void dfsc(int n, int p) {
	visited[n] = 1;
	for (int i : adjlist[n]) {
		if (visited[i]) continue;
		dfsc(i, n);
		nadjlist[n].push_back(i);
	}
}

pair<int, vector<int>> dfscover(int n, bool take) {
	if (mem[n][take].first != -1) return mem[n][take];
	vector<int> anss;
	if (!take) {
		for (int i : nadjlist[n]) {
			auto res = dfscover(i, true);
			for (int j : res.second) anss.push_back(j);
		}
	}
	else {
		anss.push_back(n);
		for (int i : nadjlist[n]) {
			auto res1 = dfscover(i, true);
			auto res2 = dfscover(i, false);
			if (res1.first > res2.first) swap(res1, res2);
			for (int j : res1.second) anss.push_back(j);
		}
	}
	return mem[n][take] = { anss.size(), anss };
}

void filll(vector<int>& filled, int k) {
	vector<int> nn;
	for (int i = 0; i < 2 * N - 1 + 2 * (N / 2); i++) {
		if (!(i & 1) && i / 2 < filled.size()) nn.push_back(filled[i / 2] + 1);
		else nn.push_back(k + 1);
	}
	ans.push_back(nn);
}

void dfs(int n) {
	if (selected[n]) {
		filll(null, n);
		filll(adjlist[n], n);
	}
	for (int i : nadjlist[n]) {
		filll(null, n);
		dfs(i);
	}
	filll(null, n);
}

std::vector<std::vector<int>> create_map(int _N, int M, std::vector<int> A, std::vector<int> B) {
	ans = vector<vector<int>>();
	N = _N;
	mem = vector<vector<pair<int, vector<int>>>>(N, vector<pair<int, vector<int>>> (2, pair<int, vector<int>>(-1, vector<int>())));
	adjlist = vector<vector<int>>(N, vector<int>());
	nadjlist = vector<vector<int>>(N, vector<int>());
	selected = vector<int>(N, 0);
	visited = vector<int>(N, 0);
	for (int i = 0; i < M; i++) {
		A[i]--, B[i]--;
		adjlist[A[i]].push_back(B[i]);
		adjlist[B[i]].push_back(A[i]);
	}
	dfsc(0, -1);
	auto res1 = dfscover(0, false);
	auto res2 = dfscover(0, true);
	if (res1.first > res2.first) swap(res1, res2);
	for (int j : res1.second) selected[j] = 1;
	dfs(0);
	while (ans.size() < 2 * N - 1 + 2 * (N / 2)) filll(null, 0);
	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...