Submission #1270666

#TimeUsernameProblemLanguageResultExecution timeMemory
1270666BuzzyBeezNetwork (BOI15_net)C++20
100 / 100
328 ms115304 KiB
#include <bits/stdc++.h> 
using namespace std;

vector<int> adj[500008], rem[500008];

void add_edge(int u, int v) {adj[u].push_back(v); adj[v].push_back(u);}

vector<pair<int, int>> ans;

int timer = 0;
void DFS(int u, int p) {
	bool is_leaf = 1; vector<pair<int, int>> Q, Q2;
	for (int v : adj[u]) if (v != p) {
		DFS(v, u); is_leaf = 0;
		for (int i : rem[v]) Q.emplace_back(v * (rem[v].size() == 1 ? 1 : -1), i);
	}
	sort(Q.begin(), Q.end());
	for (pair<int, int> item : Q) 
		if (!Q2.empty() && Q2.back().first != item.first) {
			ans.emplace_back(Q2.back().second, item.second);
			Q2.pop_back();
		}
		else Q2.emplace_back(item);
	if (is_leaf) rem[u].push_back(u);
	else if (Q2.empty()) {
		Q2 = {{0, ans.back().first}, {0, ans.back().second}};
		ans.pop_back();
	}
	for (pair<int, int> p : Q2) rem[u].push_back(p.second);
	Q.clear(); Q2.clear();
	// cout << ">> " << u << endl;
	// for (pair<int, int> p : ans) cout << p.first << ' ' << p.second << endl;
}

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n, u, v; cin >> n;
	for (int i = 1; i < n; ++i) cin >> u >> v, add_edge(u, v);
	if (n == 2) {
		cout << 1 << '\n' << 1 << ' ' << 2;
		return 0;
	}
	int rt = 1;
	while (adj[rt].size() == 1) ++rt;
	DFS(rt, 0); 
	while (rem[rt].size() > 1) {
		ans.emplace_back(*rem[rt].rbegin(), *(rem[rt].rbegin() + 1));
		rem[rt].pop_back(); rem[rt].pop_back();
	}
	if (!rem[rt].empty()) ans.emplace_back(rt, rem[rt][0]);
	cout << ans.size() << '\n';
	for (pair<int, int> p : ans) cout << p.first << ' ' << p.second << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...