高质量好题:AGC018D

Link

显然每一条边的最大贡献为 \(w_{e} \times \min(siz_U,siz_V)\) ,其中 \(U,V\) 是边 \(e\) 分割出来的两颗子树。

考虑到当以重心为根的时候(重心丢到最小的那颗子树里去),是可以卡到这个上界的。

构造方法为每次选择重心 \(u\) 的两个最大和次大的子树来回跳跃。


证明:

  • 设子树的 \(siz\) 序列为 \(x_{1},x_{2}\dots x_{n}\)
  • 当这个 \(x_{1}=x_{2}=\dots x_{n}\) 的时候可以直接反复横跳来构造。
  • \(x_{1}\) 是序列中最大值, \(x_{2}\) 是序列中最小值,它们的差值为 \(d\)
  • 每次选出最大值和次大值,让它们都 \(-1\) ,依旧满足 \(x_{1}<\sum^{n}_{i=2}x_{i}\)
  • 如果 \(x_{2}\) 成为了次大值,说明此时 \(x_{2}=x_{3}=\dots=x_{n}\) 或者\(x_{1}=x_{2}\) , 都是可以构造出来的。
  • 如果 \(x_{2}\) 不是次大值,那么每一次 \(-1\) 都可以令差值 \(d-1\) ,同时又由于 \(x_{1}<\sum^{n}_{i=2}x_{i},x_{1}-x_{2}<\sum^{n}_{i=3}x_{i}\) ,经过若干次这种操作之后一定可以让 \(d=0\)
  • 当然,这个过程中可能出现了最大值和次大值相同的情况,此时 \(-1\) 不一定会令 \(d-1\) ,但是也可以发现这样会变成最大值和次大值之间互相对耗,直到出现了新的最大值为止,依旧满足上述的这些性质,变成了一个子问题。

那么计算每条边的贡献也就是 \(2\times w_{e}\times siz_{u}\)

但是考虑到最后的一条边是无法被走两次的,该去掉哪一条边呢?

注意到,如果这棵树不存在两个重心,那么一定可以构造出一种方案使得最后是从非重儿子那边走回来,那么减去的值就是与重心相连的最小的边。否则,可以发现最后一定是从重儿子走回,那么减去重心与重儿子之间的那条边即可。

评测记录

posted @ 2021-08-12 20:58  krimson  阅读(65)  评论(0编辑  收藏  举报