[倍增][换根DP]luogu P5024 保卫王国

题面

https://www.luogu.com.cn/problem/P5024

分析

可以对有限制的点对之间的链进行在倍增上的DP数组合并。

需要通过一次正向树形DP和一次换根DP得到g[0][i][0/1]表示以i为根的子树中i为0/1的最小代价和g[1][i][0/1]表示整棵树除了以i为根的子树i为0/1的最小代价。

然后倍增数组上减去儿子方向的DP值进行预处理。倍增数组f[i][0/1][0/1][j]表示i向上跳$2^{j}$ 次,i的状态为0/1,跳到的祖先的状态为0/1的DP值。

最后做LCA时统计即可,对于不是互为祖孙的情况,需要讨论lca和其两个儿子的状态取最小值。

代码

posted @ 2020-09-16 21:19  Vagari  阅读(150)  评论(0编辑  收藏  举报