题解:P8274 [USACO22OPEN] Balancing a Tree G
_Ikun_xiaoheizi · · 题解
竟然还能交题解,那我必须水一发。
思路
考虑一条从根到叶子的路径,路径上所有点两两都有祖先后代关系。因此,这条路径对不平衡度的贡献就是路径上所有
设
对于任意一条从根到某个节点
如果
设全局最大下界为
考虑
上述两个下界的最大值就是最终的答案,
当
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[100005], l[100005], r[100005], f[100005][2];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T, b;
cin >> T >> b;
while (T--) {
memset(f, 0, sizeof(f));
cin >> n;
for (int i = 2; i <= n; i++) {
cin >> a[i];
}
int minnr = 2e9, maxxl = 0, ans = 0;
for (int i = 1; i <= n; i++) {
cin >> l[i] >> r[i];
minnr = min(r[i], minnr);
maxxl = max(l[i], maxxl);
if (a[i] != 0) {
f[i][0] = max(f[a[i]][0], l[i]);
f[i][1] = min(f[a[i]][1], r[i]);
} else {
f[i][0] = l[i];
f[i][1] = r[i];
}
ans = max(ans, f[i][0] - f[i][1]);
}
cout << max(ans, (maxxl - minnr + 1) / 2) << endl;
if (b) {
if (maxxl <= minnr) {
for (int i = 1; i <= n; i++) {
cout << maxxl << " ";
}
continue;
}
int mid = (maxxl + minnr) / 2;
for (int i = 1; i <= n; i++) {
cout << max(min(mid, r[i]), l[i]) << " ";
}
}
}
return 0;
}
总感觉写的复杂了点,不管了。