保卫王国

我们先来考虑没有特殊节点怎么做

f[i][0/1]表示以i为根的子树,i是否放置军队的最小代价,这个DP非常简单,方程就不写了

然后考虑有一个特殊节点怎么做,我们不妨以这个特殊节点为根,于是就可以发现,其他点的f的值显然都不变,对于根节点,题目要求是否放置,输出对应的f的值即可

但是我们发现这道题目可能多次询问,于是可以想到换根DP

F[i][0/1]表示原树除去以i为根的子树,剩下的部分,在i是否选择的情况下的最小代价(注意剩下的部分的情况只与i是否选择有关,而与i的子孙节点是否选择无关)

F[i][0]=F[u][1]+f[u][1]min(f[i][0],f[i][1]),F[i][1]=min(F[u][1]+f[u][1]min(f[i][0],f[i][1]),F[u][0]+f[u][0]f[i][1]),其中ui的父亲

现在来考虑有两个特殊点的情况,看这篇题解即可,下面对这篇题解做一些解释

对于这句话:

这句话的意思就是说(以题解中给的图为例),L,P,Qf值不变(这个比较显然),而在去除以D为根的子树并且确定了D是否放置之后,剩下部分构造出满足题意的最优军队放置方法不变(无论这条链上其他点是否放置)

然后题解中的dp就是上面的fndp就是上面的F

对于这句话:

就是用暴力维护而已(对链上每个点,自底向上地对每一个点重新做一遍没有特殊点的DP,也就是算f的时候的DP),下面的ans就是暴力维护之后的最新的f

对于这个状态:

实际上就是表示的是以i2t祖先的子树除去以i为根的子树的剩余部分

对于这一部分:

假设LCA倍增过程中,当前从a往上跳到的节点为i,那么ans数组表示的就是以i为根的子树除去以a为根的子树的剩余部分在i的放置情况为p时的最优放置情况

也许你还能想到另一种做法:

先考虑只有一个特殊点的情况,如下,假设p是特殊点

然后依次考虑k,j,if的变化情况,发现真的有规律

然后就可以拓展到有两个特殊点的情况

但是上面这种做法的问题就是最终统计答案的时候需要分类讨论,很麻烦。实际上,之所以想到这种办法,还是因为认为p的改变会影响全局,然而根据我们上面的分析,我们完全可以预处理出一些其他DP数组,因为去除一个子树,剩余部分的最优放置只与这个子树的根节点的放置情况有关,而与这颗子树的其他节点无关

posted @   最爱丁珰  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示