P12007 【MX-X10-T3】[LSOT-4] 全国联赛?——换根dp+贪心
li_cat
·
·
个人记录
初见思路
显而易见的观察
首先观察到 n-m-1 加上给定的 m 条边就是生成树
挖掘性质
然后考虑两棵树 x,y 合并会对答案产生什么贡献(此时假定树内已经完成)
假定 u,v 是这条边的两端所连端点, u\in x,v\in y ,权值为 w
那么x中的所有点要到 y 中的所有点
每一个条路径都要经过 <u,v> ,所以 w 造成的贡献为 w\times size_x\times size_y
那么此时考虑 x 中的节点,首先要到 v ,再散入到 y 中所有节点
所以此时贡献为
w\times size_x\times size_y+size_x\times dp_y+size_y\times dp_x
#### dp更新问题
我们发现要找到 $x$ 中 $dp$ 最小的点进行维护
合并的过程中可以动态维护,两个连通块间连边的时候肯定连这个点
那么当这两个点相连时,两边各自的 $dp$ 值如何变化呢
$$dp_u=dp_u+dp_v+w\times size_y$$
$$dp_v=dp_u+dp_v+w\times size_x$$
那么显然是所在连通块大的大了
#### 合并顺序
让小的边尽量参与到经过次数多的路径中
所以小的边先合并,每次合并并头两大的(原因也在前面的dp那块)
用大根堆维护
#### 初始化
**初始时连边是不听你的,所以重心不能动态维护**
树形dp+换根dp预处理即可
算初始状态对答案的贡献要用乘法逆元
记得开long long