保卫王国

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

\(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])\),其中\(u\)\(i\)的父亲

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

对于这句话:

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

然后题解中的\(dp\)就是上面的\(f\)\(ndp\)就是上面的\(F\)

对于这句话:

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

对于这个状态:

实际上就是表示的是以\(i\)\(2^t\)祖先的子树除去以\(i\)为根的子树的剩余部分

对于这一部分:

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

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

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

然后依次考虑\(k,j,i\)\(f\)的变化情况,发现真的有规律

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

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

posted @ 2024-02-06 19:40  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报