Submission #574278

#TimeUsernameProblemLanguageResultExecution timeMemory
574278tengiz05Village (BOI20_village)C++17
100 / 100
128 ms25524 KiB
#include <bits/stdc++.h> using i64 = long long; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; std::cin >> n; std::vector<std::vector<int>> adj(n); for (int i = 0; i < n - 1; i++) { int u, v; std::cin >> u >> v; u--; v--; adj[u].push_back(v); adj[v].push_back(u); } int mn = 0; std::vector<int> w(n, -1), o(n, -1); std::vector<int> siz(n, 1); std::function<void(int, int)> dfs = [&](int u, int p) { std::vector<int> a; int x = -1; for (int v : adj[u]) { if (v == p) continue; dfs(v, u); siz[u] += siz[v]; if (w[v] == -1) { a.push_back(v); } x = v; } int m = a.size(); if (m % 2 == 1) { for (int i = 0; i < m - 2; i += 2) { mn += 4; w[a[i]] = a[i + 1]; w[a[i + 1]] = a[i]; } mn += 2; w[u] = a[m - 1]; w[a[m - 1]] = u; } else { for (int i = 0; i < m; i += 2) { mn += 4; w[a[i]] = a[i + 1]; w[a[i + 1]] = a[i]; } if (m >= 2) { w[u] = a[0]; w[a[0]] = a[1]; w[a[1]] = u; } else if (p == -1) { mn += 2; w[u] = w[x]; w[x] = u; } } }; dfs(0, -1); std::function<int(int, int)> dfs2 = [&](int u, int p) { for (int v : adj[u]) { if (v != p && siz[v] > n / 2) { return dfs2(v, u); } } return u; }; int u = dfs2(0, -1); i64 mx = 0; std::vector<std::vector<int>> a(n); std::priority_queue<std::pair<int, int>> q; for (int v : adj[u]) { std::vector<int> b; std::function<void(int, int, int)> dfs = [&](int u, int p, int dep) { b.push_back(u); mx += dep; for (int v : adj[u]) { if (v != p) { dfs(v, u, dep + 1); } } }; dfs(v, u, 1); a[v] = b; q.emplace(b.size(), v); } while (q.size() > 1) { auto [si, i] = q.top(); q.pop(); auto [sj, j] = q.top(); q.pop(); o[a[i].back()] = a[j].back(); o[a[j].back()] = a[i].back(); a[i].pop_back(); a[j].pop_back(); if (si > 1) { q.emplace(si - 1, i); } if (sj > 1) { q.emplace(sj - 1, j); } } if (q.empty()) { int v = adj[u][0]; o[u] = o[v]; o[v] = u; } else { auto [si, i] = q.top(); assert(a[i].size() == 1); o[u] = a[i][0]; o[a[i][0]] = u; } std::cout << mn << " " << 2 * mx << "\n"; for (int i = 0; i < n; i++) { std::cout << w[i] + 1 << " \n"[i == n - 1]; } for (int i = 0; i < n; i++) { std::cout << o[i] + 1 << " \n"[i == n - 1]; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...