제출 #1293263

#제출 시각아이디문제언어결과실행 시간메모리
1293263mdobricVillage (BOI20_village)C++20
100 / 100
55 ms28152 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 100005; int n; long long d[maxn], dp[maxn], ans[maxn], ans2[maxn], rez; vector <int> v[maxn], g[maxn]; int br = 1; set <pair <int, int> > s; set <pair <int, int> > ::iterator it; void dfs (int x, int p){ d[x] = 1; for (int i = 0; i < v[x].size(); i++){ int y = v[x][i]; if (y != p){ dfs(y, x); d[x] += d[y]; if (ans2[y] == y){ swap(ans2[y], ans2[x]); rez += 2; } } } } int centroid (int x, int p){ for (int i = 0; i < v[x].size(); i++){ int y = v[x][i]; if (y != p and d[y] * 2 > d[1]) return centroid(y, x); } return x; } void dfs2 (int x, int p, int gr){ g[gr].push_back(x); d[x] = 1; dp[x] = 0; for (int i = 0; i < v[x].size(); i++){ int y = v[x][i]; if (y != p){ int novig = gr; if (gr == 0) novig = br, br++; dfs2(y, x, novig); dp[x] += dp[y] + d[y]; d[x] += d[y]; } } } int main (void){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; for (int i = 1; i <= n; i++) ans2[i] = i; for (int i = 0; i < n - 1; i++){ int a, b; cin >> a >> b; v[a].push_back(b); v[b].push_back(a); } dfs(1, 0); if (ans2[1] == 1) swap(ans2[1], ans2[v[1][0]]), rez += 2; int c = centroid(1, 0); dfs2(c, 0, 0); cout << rez << " " << dp[c] * 2 << "\n"; for (int i = 1; i <= n; i++) cout << ans2[i] << " "; cout << "\n"; for (int i = 0; i < br; i++){ s.insert({g[i].size(), i}); } it = s.end(); it--; while ((it -> first) > 1){ int in1 = it -> second; it--; int in2 = it -> second; s.erase({g[in1].size(), in1}); s.erase({g[in2].size(), in2}); ans[g[in1][g[in1].size()-1]] = g[in2][g[in2].size()-1]; ans[g[in2][g[in2].size()-1]] = g[in1][g[in1].size()-1]; g[in1].pop_back(); g[in2].pop_back(); s.insert({g[in1].size(), in1}); s.insert({g[in2].size(), in2}); it = s.end(); it--; } int prvi = -1, prosli; for (it = s.begin(); it != s.end(); it++){ if ((it -> first) > 0 and prvi == -1) prvi = it -> second; else if ((it -> first) > 0){ int tr = it -> second; ans[g[tr][0]] = g[prosli][0]; } prosli = it -> second; } ans[g[prvi][0]] = g[prosli][0]; for (int i = 1; i <= n; i++) cout << ans[i] << " "; cout << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...