我们先来考虑没有特殊节点怎么做
设表示以为根的子树,是否放置军队的最小代价,这个DP非常简单,方程就不写了
然后考虑有一个特殊节点怎么做,我们不妨以这个特殊节点为根,于是就可以发现,其他点的的值显然都不变,对于根节点,题目要求是否放置,输出对应的的值即可
但是我们发现这道题目可能多次询问,于是可以想到换根DP
设表示原树除去以为根的子树,剩下的部分,在是否选择的情况下的最小代价(注意剩下的部分的情况只与是否选择有关,而与的子孙节点是否选择无关)
有,其中是的父亲
现在来考虑有两个特殊点的情况,看这篇题解即可,下面对这篇题解做一些解释
对于这句话:

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

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

实际上就是表示的是以的祖先的子树除去以为根的子树的剩余部分
对于这一部分:

假设LCA倍增过程中,当前从往上跳到的节点为,那么数组表示的就是以为根的子树除去以为根的子树的剩余部分在的放置情况为时的最优放置情况
也许你还能想到另一种做法:
先考虑只有一个特殊点的情况,如下,假设是特殊点

然后依次考虑的的变化情况,发现真的有规律
然后就可以拓展到有两个特殊点的情况
但是上面这种做法的问题就是最终统计答案的时候需要分类讨论,很麻烦。实际上,之所以想到这种办法,还是因为认为的改变会影响全局,然而根据我们上面的分析,我们完全可以预处理出一些其他DP数组,因为去除一个子树,剩余部分的最优放置只与这个子树的根节点的放置情况有关,而与这颗子树的其他节点无关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构