제출 #656276

#제출 시각아이디문제언어결과실행 시간메모리
656276ilia_rrNetwork (BOI15_net)C++17
0 / 100
68 ms112188 KiB
// بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ // Written by Ilia Rahbar // #pragma GCC optimize ("O3,no-stack-protector,unroll-loops,fast-math") // #pragma GCC target ("abm,bmi,bmi2,tbm,avx2") #include <bits/stdc++.h> using namespace std; #define int int64_t #define ai(x) array <int, x> #define F first #define S second const int MOD = 1e9 + 7, N = 1e6 + 100; int c, n, u[N], v[N], d[N], stc, l, r, co[N], mv = 1e9, fv[N]; vector <int> g[N], st[N], ans[2]; void dfs(int inx) { if (g[inx].size() == 1) st[stc].push_back(inx); for (auto i : g[inx]) { if (!d[i]) { d[i] = 1; dfs(i); } } } void dfs0(int inx, int par) { d[inx] = d[par] + 1; co[inx] = (g[inx].size() == 1); for (auto i : g[inx]) { if (d[i]) continue; dfs0(i, inx); co[inx] += co[i]; } } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i < n; i++) cin >> u[i] >> v[i], g[u[i]].push_back(v[i]), g[v[i]].push_back(u[i]); dfs0(1, 0); for (int i = 1; i <= n; i++) { if (g[i].size() > g[c].size()) c = i; } for (int i = 1; i < n; i++) { if (d[u[i]] > d[v[i]]) swap(u[i], v[i]); if (abs(co[v[i]] - (co[1] - co[v[i]])) <= mv) { mv = abs(co[v[i]] - (co[1] - co[v[i]])); if (co[v[i]] < (co[1] - co[v[i]]) && g[u[i]].size() > 1) c = u[i]; else if (g[v[i]].size() > 1) c = v[i]; } } memset(d, 0, sizeof d); d[c] = 1; for (auto i : g[c]) { dfs(i); stc++; } sort(st, st+stc, [](vector <int> &x, vector <int> &y){return (x.size() < y.size());}); for (int i = 0; i < stc; i++) fv[i] = st[i].size(); l = 0; r = stc-1; while (st[r].size()) { for (int i = r-1; st[r].size() && i >= l; i--) { ans[0].push_back(st[r].back()); ans[1].push_back(st[i].back()); st[r].pop_back(); st[i].pop_back(); } while (l < r && st[r].empty()) r--; while (l < r && st[l].empty()) l++; if (l == r && st[r].size()) { if (int(st[r].size()) == fv[r]) { ans[0].push_back(st[r].back()); st[r].pop_back(); ans[1].push_back(c); } while (st[r].size()) { ans[0].push_back(st[r].back()); st[r].pop_back(); if (st[r].size()) { ans[1].push_back(st[r].back()); st[r].pop_back(); } else ans[1].push_back(c); } } } cout << ans[0].size() << "\n"; for (int i = 0; i < int(ans[0].size()); i++) cout << ans[0][i] << " " << ans[1][i] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...