Submission #1280713

#TimeUsernameProblemLanguageResultExecution timeMemory
1280713Blistering_BarnaclesVillage (BOI20_village)C++20
0 / 100
1 ms12088 KiB
//Billions of bilious blue blistering barnacles in a thundering typhoon!
//Yesterday is history, tomorrow is a mystery, today is a gift of God, which is why we call it the present.
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
void solve() {
    int n;
    cin >> n;
    vector<vector<int>> adj(n + 1);
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v), adj[v].push_back(u);
    }
    vector<int> sz(n + 1);
    auto dfs = [&](auto &&self, int v, int par) -> void {
        sz[v] = 1;
        for (int u: adj[v]) {
            if (u == par) continue;
            self(self, u, v);
            sz[v] += sz[u];
        }
    };
    dfs(dfs, 1, 0);
    auto get = [&](auto &&self, int v, int par) -> int {
        for (int u: adj[v]) {
            if (u == par || sz[u] <= n / 2) continue;
            return self(self, u, v);
        }
        return v;
    };
    int cen = get(get, 1, 0);
    vector<vector<pair<int, int>>> vals(n + 1);
    for (int u: adj[cen]) {
        auto dfs2 = [&](auto &&self, int v, int par, int d) -> void {
            vals[u].push_back({d, v});
            for (int u2: adj[v]) {
                if (u2 == par) continue;
                self(self, u2, v, d + 1);
            }
        };
        dfs2(dfs2, u, cen, 1);
    }
    set<tuple<int, int, int>> se;
    vector<int> ptr(n + 1);
    for (int u: adj[cen]) {
        sort(vals[u].rbegin(), vals[u].rend());
        se.insert({vals[u][0].first, vals[u][0].second, u});
    }
    vector<int> ans(n + 1);
    cout << cen << "\n";
    i64 sum = 0;
    for (int i = 2; i <= n; i++) {
        sum += 2 * min(sz[i], n - sz[i]);
    }
    int lst = 0;
    while ((int)se.size() > 1) {
        auto [d1, v1, u1] = *se.rbegin();
        se.erase(--se.end());
        auto [d2, v2, u2] = *se.rbegin();
        se.erase(--se.end());
        lst = v1;
        ans[v1] = v2, ans[v2] = v1;
        ptr[u1]++;
        ptr[u2]++;
        if (ptr[u1] < (int)vals[u1].size()) se.insert({vals[u1][ptr[u1]].first, vals[u1][ptr[u1]].second, u1});
        if (ptr[u2] < (int)vals[u2].size()) se.insert({vals[u2][ptr[u2]].first, vals[u2][ptr[u2]].second, u2});
    }
    if ((int) se.size() == 1) {
        auto [d1, v1, u1] = *se.begin();
        ans[v1] = cen, ans[cen] = v1;
    } else {
        ans[cen] = ans[lst], ans[lst] = cen;
    }
    cout << sum << "\n";
    for (int i = 1; i <= n; i++) cout << ans[i] << " ";
    cout << "\n";
}
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int tt = 1;
    //cin >> tt;
    while (tt--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...