Submission #1153452

#TimeUsernameProblemLanguageResultExecution timeMemory
1153452antonnVillage (BOI20_village)C++20
100 / 100
80 ms17848 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5 + 7;

int n, sz[N];
vector<int> g[N];

ll sum_min = 0, sum_max = 0;
vector<int> mnmz, mxmz;

void dfs_min(int u, int p = 0) {
    for (auto v : g[u]) {
        if (v != p) {
            dfs_min(v, u);
            if (mnmz[v - 1] == v) {
                sum_min += 2;
                swap(mnmz[u - 1], mnmz[v - 1]);
            }
        }
    }
}

void solvemin() {
    mnmz.resize(n);
    iota(mnmz.begin(), mnmz.end(), 1);
    dfs_min(1);
    if (mnmz[0] == 1) {
        sum_min += 2;
        swap(mnmz[0], mnmz[g[1][0] - 1]);
    }
}

void calc(int u, int p = -1) {
    sz[u] = 1;
    for (auto v : g[u]) {
        if (v != p) {
            calc(v, u);
            sz[u] += sz[v];
            sum_max += 2 * min(n - sz[v], sz[v]);
        }
    }
}

int centr = -1;

int find_centroid(int u, int p = -1) {
    for (auto v : g[u]) {
        if (v != p && sz[v] > n / 2) {
            return find_centroid(v, u);
        }
    }
    return u;
}

vector<pair<int, int>> a, b;

void dfs(int u, int orig, int p) {
    a.push_back({orig, u});
    for (auto v : g[u]) {
        if (v != p) {
            dfs(v, orig, u);
        }
    }
}

void solvemax() {
    calc(1);
    centr = find_centroid(1);
    for (auto v : g[centr]) {
        dfs(v, v, centr);
    }
    a.push_back({n + 1, centr});
    b = a;
    sort(a.begin(), a.end());
    sort(b.rbegin(), b.rend());
    int repair = -1;
    for (int i = 0; i < n; ++i) {
        if (a[i].first == b[i].first) {
            repair = a[i].first;
        }
    }
    vector<int> help;
    for (int i = 0; i < n; ++i) {
        if (a[i].first != repair && b[i].first != repair) {
            help.push_back(i);
        }
    }
    reverse(help.begin(), help.end());
    for (int i = 0; i < n; ++i) {
        if (a[i].first == b[i].first) {
            swap(a[help.back()], a[i]);
            help.pop_back();
        }
    }
    mxmz.resize(n);
    for (int i = 0; i < n; ++i) mxmz[a[i].second - 1] = b[i].second;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for (int i = 1; i < n; ++i) {
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    solvemin();
    solvemax();
    cout << sum_min << " " << sum_max << "\n";
    for (auto x : mnmz) cout << x << " ";
    cout << "\n";
    for (auto x : mxmz) cout << x << " ";
    cout << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...