제출 #1258109

#제출 시각아이디문제언어결과실행 시간메모리
1258109pandaa73세계 지도 (IOI25_worldmap)C++20
86 / 100
31 ms4164 KiB
#include <bits/stdc++.h>
using namespace std;

#define lf "\n"
#define ff endl
#define _ << ' ' <<
#define all(x) begin(x),end(x)
#define rall(x) rbegin(x),rend(x)

#define infos(str) do { fprintf(stderr, str"\n"); } while(0)
#define infor(str, ...) do { fprintf(stderr, str, __VA_ARGS__); } while(0)
#define infof(str, ...) do { fprintf(stderr, str"\n", __VA_ARGS__); } while(0)

#ifndef DEBUG

#undef infos
#undef infor
#undef infof

#define infos(str)
#define infor(str, ...)
#define infof(str, ...)

#endif

using ll = long long;

constexpr int LOG = 20;
constexpr int MOD = 1e9+7;
constexpr int MAXN = 1e5+7;

std::vector<std::vector<int>> create_map(int N, int M,
        std::vector<int> A, std::vector<int> B) {
    if(N == 1) return {{1}};

    vector<set<int>> adj(N + 1);
    for(int i = 0; i < M; ++i) {
        adj[A[i]].insert(B[i]);
        adj[B[i]].insert(A[i]);
    }

    vector<bool> vis(N + 1);

    vector<int> tour;
    auto dfs = [&](int v, auto &&dfs) -> void {
        tour.push_back(v);
        vis[v] = 1;

        for(auto u: adj[v]) {
            if(vis[u]) continue;

            dfs(u, dfs);

            tour.push_back(v);
        }
    };

    dfs(1, dfs);

    tour.resize(2 * N, 1);

    fill(all(vis), 0);

    vector<vector<int>> ans(3 * N, vector<int>(3 * N));

    int sz = 2 * N;
    int skip = 0;
    int done = 0;

    int r = 0;
    for(int i = 0; i < 2 * N; ++i) {
        infof("%d: r = %d | sz = %d", i, r, sz);

        if(done + skip == N && r >= sz) break;

        int v = tour[i];

        if(done > 0) {
            for(int c = done&1; c < 3 * N; c += 2)
                ans[r][c] = v;
            r++;
        }

        fill(all(ans[r]), v);

        if(vis[v]) continue;
        vis[v] = 1;

        int c = done&1;
        for(auto u: adj[v]) {
            ans[r][c] = u;

            adj[u].erase(v);
            if(adj[u].empty()) {
                vis[u] = 1;
                skip++;
            }

            c += 2;
        }

        r++;

        sz = max(sz, c - 1);

        done++;
        fill(all(ans[r]), v);
    }

    sz = max(sz, r);

    ans.resize(sz);
    for(auto &v: ans)
        v.resize(sz);

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