Submission #476661

#TimeUsernameProblemLanguageResultExecution timeMemory
476661thiago_bastosNetwork (BOI15_net)C++17
100 / 100
596 ms92572 KiB
#include "bits/stdc++.h" using namespace std; using i64 = long long; using u64 = unsigned long long; using i32 = int; using u32 = unsigned; using i16 = short; using u16 = unsigned short; using ld = long double; using ii = pair<int, int>; vector<vector<int>> g; vector<int> leaves; int n; void preprocess(int u, int p = -1) { leaves[u] = 0; if((int)g[u].size() == 1) ++leaves[u]; for(int v : g[u]) { if(v == p) continue; preprocess(v, u); leaves[u] += leaves[v]; } } int dfs(int u, int p = -1) { int max_leaves = 0; if(p != -1) max_leaves = leaves[0] - leaves[u]; for(int v : g[u]) { if(v == p) continue; max_leaves = max(max_leaves, leaves[v]); } if(max_leaves <= leaves[0] / 2) return u; for(int v : g[u]) { if(v == p) continue; int w = dfs(v, u); if(w != -1) return w; } return -1; } void solve() { cin >> n; g.resize(n); leaves.resize(n); for(int i = 1; i < n; ++i) { int u, v; cin >> u >> v; --u, --v; g[u].push_back(v); g[v].push_back(u); } preprocess(0); int v = dfs(0); vector<vector<int>> F; function<void(int, int)> get = [&](int u, int p) { if(g[u].size() == 1) F.back().push_back(u); for(int v : g[u]) { if(v == p) continue; get(v, u); } }; for(int u : g[v]) { F.push_back({}); get(u, v); } vector<ii> pairs; set<ii> S; for(int i = 0; i < (int)F.size(); ++i) S.insert({(int)F[i].size(), i}); while(!S.empty()) { ii e = *S.begin(); ii d = *S.rbegin(); if(e == d) break; S.erase(S.begin()); S.erase(d); pairs.emplace_back(F[e.second].back() + 1, F[d.second].back() + 1); F[e.second].pop_back(); F[d.second].pop_back(); if(--e.first) S.insert(e); if(--d.first) S.insert(d); } for(auto& x : F) { if(x.empty()) continue; int u = x.back(); for(int v = 0; v < n; ++v) { if(v == u || g[v].size() > 1) continue; pairs.emplace_back(u + 1, v + 1); break; } break; } cout << pairs.size() << '\n'; for(auto [u, v] : pairs) cout << u << ' ' << v << '\n'; } int main() { ios_base :: sync_with_stdio(false); cin.tie(0); int t = 1; //cin >> t; while(t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...