#include "worldmap.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> DFS_long_order(vector<vector<int>>& adj) {
const int n = adj.size();
mt19937 mt(time(0));
vector<int> order;
vector<int> par(n, -1), vis(n);
auto Dfs = [&](auto&& self, int node) -> void {
order.push_back(node);
vis[node] = 1;
for (int child : adj[node]) if (!vis[child] && child != par[node]) {
par[child] = node;
self(self, child);
return;
}
if (par[node] != -1) {
self(self, par[node]);
}
};
for (int i = 0; i < n; i++) {
shuffle(adj[i].begin(), adj[i].end(), mt);
}
Dfs(Dfs, mt() % n);
return order;
}
struct Up {
int i, j;
bool operator<(const Up& other) const {
return make_pair(j - i, j) < make_pair(other.j - other.i, other.j);
}
};
std::string to_string(Up up) {
return "{" + to_string(up.i) + ", " + to_string(up.j) + "}";
}
vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) {
const int K = 2 * N;
vector<vector<int>> adj(N);
for (int i = 0; i < M; i++) {
A[i]--; B[i]--;
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<int> order = DFS_long_order(adj);
while (int(order.size()) < 2 * K) {
order.push_back(order.back());
}
vector<set<int>> rem_neighbours(N);
for (int i = 0; i < N; i++) {
for (int node : adj[i]) {
rem_neighbours[i].insert(node);
}
}
for (int i = 0; i < int(order.size()) - 1; i++) {
if (rem_neighbours[order[i]].count(order[i + 1])) {
rem_neighbours[order[i]].erase(order[i + 1]);
}
if (rem_neighbours[order[i + 1]].count(order[i])) {
rem_neighbours[order[i + 1]].erase(order[i]);
}
}
vector<vector<int>> ans(K, vector<int>(K));
auto Set = [&](int i, int j, int c) -> void {
if (i >= 0 && i < K && j >= 0 && j < K && !ans[i][j]) ans[i][j] = c + 1;
};
set<Up> border;
vector<int> vis(N);
auto Place = [&](int i, int j, int oc, int c) -> void {
ans[i][j] = c + 1;
border.erase({i, j});
Set(i - 1, j, oc);
Set(i, j + 1, oc);
if (i - 2 >= 0 && !ans[i - 2][j]) {
border.insert({i - 2, j});
}
if (i - 1 >= 0 && j + 1 < K && !ans[i - 1][j + 1]) {
border.insert({i - 1, j + 1});
}
if (j + 2 < K && !ans[i][j + 2]) {
border.insert({i, j + 2});
}
};
border.insert({K - 1, 0});
for (int c = 0; !border.empty(); c++) {
set<Up> newBorder;
for (auto [i, j] : border) {
Set(i, j, order[c]);
if (i - 1 >= 0 && !ans[i - 1][j]) {
newBorder.insert({i - 1, j});
}
if (j + 1 < K && !ans[i][j + 1]) {
newBorder.insert({i, j + 1});
}
}
swap(border, newBorder);
if (vis[order[c]]) continue;
vis[order[c]] = 1;
for (int col : rem_neighbours[order[c]]) if (!vis[col]) {
auto [i, j] = *border.begin();
Place(i, j, order[c], col);
}
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |