제출 #1277300

#제출 시각아이디문제언어결과실행 시간메모리
1277300julia_08Village (BOI20_village)C++20
100 / 100
79 ms28116 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 1e5 + 10; int to[MAXN]; int sub[MAXN]; int p[MAXN]; int deg[MAXN], marc[MAXN]; vector<int> adj[MAXN], c[MAXN]; int n; void dfs_1(int v, int p){ sub[v] = 1; for(auto u : adj[v]){ if(u != p){ dfs_1(u, v); sub[v] += sub[u]; } } } int get_centroid(int v, int p){ for(auto u : adj[v]){ if(u != p){ if(sub[u] > n / 2) return get_centroid(u, v); } } return v; } void dfs_2(int v, int p, vector<int> &vtx){ vtx.push_back(v); for(auto u : adj[v]){ if(u != p){ dfs_2(u, v, vtx); } } } int32_t main(){ cin.tie(0)->sync_with_stdio(0); cin >> n; for(int i=1; i<n; i++){ int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); deg[a] ++; deg[b] ++; } // min: queue<int> q; for(int i=1; i<=n; i++){ if(deg[i] == 1){ q.push(i); } } ll ans_min = 0; while(!q.empty()){ int v = q.front(); q.pop(); if(!c[v].empty()){ marc[v] = 1; int sz = (int) c[v].size(); ans_min += 2 * sz; if(sz % 2 == 0){ while(sz > 2){ auto [a, b] = make_pair(c[v][sz - 2], c[v][sz - 1]); p[a] = b; p[b] = a; sz -= 2; } auto [a, b] = make_pair(c[v][0], c[v][1]); p[v] = a; p[b] = v; p[a] = b; } else{ while(sz > 1){ auto [a, b] = make_pair(c[v][sz - 2], c[v][sz - 1]); p[a] = b; p[b] = a; sz -= 2; } p[v] = c[v][0]; p[c[v][0]] = v; } } for(auto u : adj[v]){ deg[u] --; if(!marc[v]) c[u].push_back(v); if(deg[u] == 1) q.push(u); } } for(int i=1; i<=n; i++){ if(p[i] == 0){ p[i] = i; swap(p[i], p[adj[i][0]]); ans_min += 2; } } // max: dfs_1(1, 1); int c = get_centroid(1, 1); dfs_1(c, c); vector<pair<int, int>> to_add; for(auto u : adj[c]) to_add.push_back({sub[u], u}); sort(to_add.rbegin(), to_add.rend()); vector<int> vtx; for(auto [x, u] : to_add) dfs_2(u, c, vtx); vtx.push_back(c); int sz = (int) vtx.size(); for(int i=0; i<sz; i++) vtx.push_back(vtx[i]); int k = to_add[0].first; for(int i=0; i<sz; i++) to[vtx[i]] = vtx[i + k]; ll ans_max = 0; for(int i=1; i<=n; i++) ans_max += 2 * min(sub[i], n - sub[i]); cout << ans_min << " " << ans_max << "\n"; for(int i=1; i<=n; i++) cout << p[i] << " "; cout << "\n"; for(int i=1; i<=n; i++) cout << to[i] << " "; cout << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...