제출 #1254216

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

#define nl "\n"
#define nf endl
#define ll long long
#define pb push_back
#define _ << ' ' <<

#define INF (ll)1e18
#define mod 998244353
#define maxn 110

#include "worldmap.h"

vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) {
    // subtask 5

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

    vector<vector<vector<ll>>> dp(N + 1);
    vector<ll> pr(N + 1, -1);
    vector<vector<ll>> children(N + 1), subs(N + 1);

    vector<bool> vis(N + 1, false);
    vector<ll> tin(N + 1, -1);
    ll curr_time = 1;

    function<void(ll)> dfs = [&](ll s) {
        vis[s] = true;
        tin[s] = curr_time; curr_time++;
        for (auto u : adj[s]) {
            if (vis[u]) continue;
            pr[u] = s; children[s].pb(u);
            dfs(u);
        }
    };

    dfs(1);

    for (ll i = 0; i < M; i++) {
        ll a = A[i], b = B[i];
        if (tin[a] > tin[b]) swap(a, b);
        if (pr[b] == a) continue;
        subs[a].pb(b);
    }

    auto frame = [&](ll s, vector<ll> v) {
        if (v.empty()) v = {s};
        vector ans(2 * (ll)v.size() - 1, vector<ll>(1, s));
        for (ll i = 0; i < v.size(); i++) ans[2 * i][0] = v[i];
        return ans;
    };

    function<void(ll)> build = [&](ll s) {
        vector<vector<ll>> last = frame(s, subs[s]);
        ll h = last.size() + 2, w = 3;
        for (auto u : children[s]) {
            build(u);
            h = max(h, (ll)dp[u].size() + 2);
            w += dp[u].back().size() + 1;
        }

        dp[s] = vector(h, vector<ll>(w, s));
        ll curr_j = 1;

        auto onion = [&](vector<vector<ll>> v) {
            for (ll i = 0; i < v.size(); i++) {
                for (ll j = 0; j < v.back().size(); j++) {
                    dp[s][i + 1][curr_j + j] = v[i][j];
                }
            }
            curr_j += v.back().size() + 1;
        };

        for (auto u : children[s]) {
            onion(dp[u]);
        }
        onion(last);

        /* cout << "build" _ s << nf;
        for (auto v : dp[s]) {
            for (auto u : v) {
                cout << u << ' ';
            }
            cout << nf;
        } */
    };

    build(1);

    ll sz = max(dp[1].size(), dp[1].back().size());
    vector<vector<int>> ans(sz, vector<int>(sz, 1));

    for (ll i = 0; i < dp[1].size(); i++) {
        for (ll j = 0; j < dp[1].back().size(); j++) {
            ans[i][j] = dp[1][i][j];
        }
    }

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