P9128 [USACO23FEB] Fertilizing Pastures G
先考虑
设
式子中和
那么最优的顺序一定按照
对于
设最大深度为
当然,我们不可能对于每个可能的
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5e5 + 5;
const LL inf = 2e18;
int n, t, mxd, a[N], sz[N], dep[N]; LL sum[N], f[N], g[N], suf[N];
bool mark[N];
vector <int> e[N];
struct dat {
LL a, b; int v;
} d[N];
void dfs0(int u) {
for (auto v : e[u]) dfs0(v), dep[u] = max(dep[u], dep[v] + 1);
}
void ptag(int u, int d) {
if (d + dep[u] == mxd) mark[u] = 1;
for (auto v : e[u]) ptag(v, d + 1);
}
void dfs(int u) {
sz[u] = 1, sum[u] = a[u];
int m = 0;
for (auto v : e[u]) {
dfs(v);
sz[u] += sz[v], sum[u] += sum[v];
f[u] += f[v];
}
for (auto v : e[u]) {
d[++m] = (dat){ sum[v], 2 * sz[v], v };
}
sort(d + 1, d + m + 1, [&](dat i, dat j) { return j.a * i.b < i.a * j.b; });
LL val = 0, sb = 1;
for (int i = 1; i <= m; i++) {
val += d[i].a * sb, sb += d[i].b;
}
suf[m + 1] = 0;
for (int i = m; i >= 1; i--) suf[i] = suf[i + 1] + d[i].a;
LL ret = inf, pre = 1;
for (int i = 1; i <= m; i++) {
int v = d[i].v;
if (mark[v]) ret = min(ret, f[u] - f[v] + g[v] + val - d[i].b * suf[i + 1] - d[i].a * pre + d[i].a * (sb - d[i].b));
pre += d[i].b;
}
f[u] += val, g[u] = ret;
if (m == 0) g[u] = 0;
}
int main() {
ios :: sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> t;
for (int i = 2, ff; i <= n; i++) {
cin >> ff >> a[i];
e[ff].push_back(i);
}
dfs0(1), mxd = 0;
for (int i = 1; i <= n; i++) mxd = max(mxd, dep[i]);
ptag(1, 0), dfs(1);
if (t == 0) cout << 2 * (n - 1) << " " << f[1] << "\n";
else cout << 2 * (n - 1) - mxd << " " << g[1] << "\n";
return 0;
}