제출 #1276703

#제출 시각아이디문제언어결과실행 시간메모리
1276703julia_08Village (BOI20_village)C++20
50 / 100
55 ms27644 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 1e5 + 10; int to[MAXN]; int sub[MAXN]; vector<int> adj[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); } 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 = 0; for(int i=1; i<=n; i++) ans += 2 * min(sub[i], n - sub[i]); cout << "1 " << ans << "\n"; for(int i=1; i<=n; i++) cout << "1 "; 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...