记录编号 618143 评测结果 AAAAAAAAAA
题目名称 4445.饭团 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 8.905 s
提交时间 2026-08-27 09:58:34 内存使用 11.80 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int p[N], dfn[N], rk[N], cnt, sz[N];
int l[N], r[N], pt[N], n;
vector<int> G[N];
void clear() {
	for (int i = 1; i <= n; i++) {
		G[i].clear();
		l[i] = r[i] = pt[i] = 0;
		p[i] = dfn[i] = rk[i] = sz[i] = 0;
	}
	cnt = 0;
}
void add(int x, int y) {
	G[x].push_back(y);
}
void dfs(int x, int fa) {
	rk[dfn[x] = ++cnt] = x;
	sz[x] = 1;
	for (auto y : G[x]) {
		if (y == fa) continue;
		dfs(y, x);
		sz[x] += sz[y];
	}
	return;
}
void solve(int x, int y, int a, int b) {
	if (a > b || x > y) return;
	if (a == b) {
		for (int i = x; i <= y; i++) {
			cout << "=" << p[i];
		}
	} else {
		int mid = (a + b) >> 1, lt = x, rt = y;
		vector<int> tmp; tmp.clear();
		for (int i = x; i <= y; i++) {
			if (l[p[i]] <= mid && r[p[i]] > mid) {
				tmp.push_back(p[i]);
			} else if (r[p[i]] <= mid) {
				pt[lt++] = p[i];
			} else {
				pt[rt--] = p[i];
			}
		}
		sort(tmp.begin(), tmp.end(), [&](int u, int v) {
			return l[u] < l[v];
		});
		int lp = a, rp = b;
		for (auto v : tmp) {
			while (lp < l[v]) cout << "+" << rk[lp], lp++;
			while (rp > r[v]) cout << "+" << rk[rp], rp--;
			cout << "=" << v;
		}
		while (lp > a) cout << "-", lp--;
		while (rp < b) cout << "-", rp++;
		for (int i = rt + 1; i <= y; i++) p[i] = pt[i], pt[i] = 0;
		for (int i = x; i <= lt - 1; i++) p[i] = pt[i], pt[i] = 0;
		if (rt + 1 <= y) {
			for (int i = a; i <= mid; i++) cout << "+" << rk[i];
			solve(rt + 1, y, mid + 1, b);
			for (int i = a; i <= mid; i++) cout << "-";
		}
		if (x <= lt - 1) {
			for (int i = mid + 1; i <= b; i++) cout << "+" << rk[i];
			solve(x, lt - 1, a, mid);
			for (int i = mid + 1; i <= b; i++) cout << "-";
		}
	}
}
int main() {
	freopen("riceball.in", "r", stdin);
	freopen("riceball.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int T; cin >> T;
	while (T--) {
		cin >> n;
		for (int i = 2, u, v; i <= n; i++) {
			cin >> u >> v;
			add(u, v), add(v, u);
		}
		dfs(1, 0); 
		for (int i = 1; i <= n; i++) {
			l[i] = dfn[i], r[i] = dfn[i] + sz[i] - 1;
			p[i] = i; 
		}
		solve(1, n, 1, n);
		cout << "!" << '\n';
		clear();
	}
	return 0;
}