#include "worldmap.h"
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "/home/fv3/Desktop/prog/debug/debug.h"
#else
#define debug(...) 42
#endif
int n, m;
mt19937 mt(time(0));
optional<vector<vector<int>>> solve(vector<vector<int>>& adj) {
    vector<int> col;
    vector<int> vis(n), last(n, -1);
    vector<vector<int>> pos(n);
    int rem = n;
    auto Dfs = [&](auto&& self, int i) -> void {
        pos[i].push_back(col.size());
        col.push_back(i);
        if (!vis[i]) {
            vis[i] = 1;
            if (!--rem) return;
        }
        for (auto node : adj[i]) if (node != last[i] && !vis[node]) {
            last[node] = i;
            self(self, node);
            return;
        }
        if (last[i] >= 0) {
            self(self, last[i]);
        }
    };
    for (auto &list : adj) {
        shuffle(list.begin(), list.end(), mt);
    }
    Dfs(Dfs, mt() % n);
    assert(!rem);
    set<int> extra;
    for (int i = 0; i < n; i++) {
        extra.insert(pos[i][mt() % pos[i].size()]);
    }
    int lines = col.size() + 2*n;
    int K = 2 * n;
    vector<vector<pair<int, int>>> diags(2 * K - 1);
    for (int i = 0; i < K; i++) {
        for (int j = 0; j < K; j++) {
            diags[K-1 + i - j].push_back({i, j});
        }
    }
    vector<set<int>> radj(n);
    for (int i = 0; i < n; i++) {
        for (auto node : adj[i]) {
            radj[i].insert(node);
        }
    }
    for (int i = 0; i < int(col.size()) - 1; i++) {
        if (radj[col[i]].count(col[i+1])) {
            radj[col[i]].erase(col[i+1]);
        }
        if (radj[col[i+1]].count(col[i])) {
            radj[col[i+1]].erase(col[i]);
        }
    }
    int diag = (2*K - 1 - lines) / 2;
    int sz = int(col.size());
    vector<int> extra_index(n);
    vector<vector<int>> ans(K, vector<int>(K, col[0] + 1));
    for (int i = 0; i < sz; i++) {
        for (auto [y, x] : diags[diag]) {
            ans[y][x] = col[i] + 1;
        }
        diag++;
        if (!extra.count(i)) continue;
        extra_index[col[i]] = diag;
        for (int _ = 0; _ < 2; _++) {
            for (auto [y, x] : diags[diag]) {
                ans[y][x] = col[i] + 1;
            }
            diag++;
        }
    }
    while (diag < 2 * K - 1) {
        for (auto [y, x] : diags[diag++]) {
            ans[y][x] = col.back() + 1;
        }
    }
    rem = n;
    queue<int> que;
    for (int c = 0; c < n; c++) {
        if (diags[extra_index[c]].size() < radj[c].size()) continue;
        que.push(c);
        vis[c] = 1;
        rem--;
    }
    while (!que.empty()) {
        int s = que.front();
        que.pop();
        int i = 0;
        for (auto c : radj[s]) {
            auto [y, x] = diags[extra_index[s]][i];
            ans[y][x] = c + 1;
            i++;
        }
        for (int c = 0; c < n; c++) {
            if (vis[c] || !radj[c].count(s)) continue;
            radj[c].erase(s);
            if (diags[extra_index[c]].size() < radj[c].size()) continue;
            que.push(c);
            vis[c] = 1;
            rem--;
        }
        for (int c = 0; c < n; c++) {
            if (vis[c] || diags[extra_index[c]].size() < radj[c].size()) continue;
            que.push(c);
            vis[c] = 1;
            rem--;
        }
    }
    debug(col);
    if (rem) {
        exit(0);
        return {};
    }
    return ans;
}
vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) {
    n = N; m = M;
    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]);
    }
    for (int i = 0; i < n; i++) {
        if (int(adj[i].size()) == N - 1) {
            const int K = 2 * N;
            vector<vector<int>> ans(K, vector<int>(K, i + 1));
            int x = 0, y = 0;
            for (int j = 0; j < M; j++) {
                ans[y+1][x+1] = A[j] + 1;
                ans[y+1][x+2] = B[j] + 1;
                x += 4;
                if (x + 2 >= K) {
                    x = 0;
                    y += 4;
                }
            }
            return ans;
        }
    }
    auto ans = solve(adj);
    while (!ans) ans = solve(adj);
    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... |