WA#19 求调/kel
查看原帖
WA#19 求调/kel
362750
TernaryTree楼主2024/1/29 09:18
#include <bits/stdc++.h>
#define int long long

using namespace std;
using pii = pair<int, int>;

const int maxn = 1e6 + 10;

int T;
int n, root;
int w[maxn];
vector<int> g[maxn];
int dfn[maxn], idx;
vector<int> p;
int f[maxn];

void dfs1(int u, int fa) {
	dfn[u] = ++idx;
	f[u] = fa;
	for (int v : g[u]) {
		if (v == fa) continue;
		dfs1(v, u);
	}
} 

multiset<pii> s, t;

int calc(int u) {
	int x = u;
	while (true) {
		t.insert({w[x], x});
		s.erase(s.find({w[x], x}));
		if (g[x].size() >= 3 || x == root) break;
		x = f[x];
	}
	int res = s.begin()->second;
	while (!t.empty()) {
		pii y = *t.begin();
		s.insert(y);
		t.erase(y);
	}
	return res;
}

signed main() {
	cin >> T;
	while (T--) {
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> w[i];
			g[i].clear();
			dfn[i] = f[i] = 0;
		}
		for (int i = 2; i <= n; i++) {
			int u, v;
			cin >> u >> v;
			g[u].push_back(v), g[v].push_back(u);
		}
		for (int i = 1; i <= n; i++) {
			if (g[i].size() > 1) {
				root = i;
				break;
			}
		}
		p.clear();
		for (int i = 1; i <= n; i++) {
			if (g[i].size() == 1) p.push_back(i);
		}
		idx = 0;
		dfs1(root, 0);
		sort(p.begin(), p.end(), [] (int x, int y) {
			return dfn[x] < dfn[y];
		});
		if (p.size() & 1) {
			s.clear();
			for (int i = 1; i <= n; i++) s.insert({w[i], i});
			int u, z, y = 1145141919810ll;
			for (int i = 0; i < p.size(); i++) {
				int x = calc(p[i]);
				if (w[x] < y) {
					y = w[x];
					u = x;
					z = i;
				}
			}
			cout << (p.size() >> 1) + 1 << endl;
			cout << p[z] << " " << u << endl;
			p.erase(p.begin() + z);
			for (int i = 0; i < (p.size() >> 1); i++) cout << p[i] << " " << p[i + (p.size() >> 1)] << endl;
		} else {
			cout << (p.size() >> 1) << endl;
			for (int i = 0; i < (p.size() >> 1); i++) cout << p[i] << " " << p[i + (p.size() >> 1)] << endl;
		}
	}
	return 0;
}
2024/1/29 09:18
加载中...