「Note」整体DP小记
智慧智慧。
当树上问题能列出二维的 DP 方程,并且转移方程不是很复杂的时候可以用线段树来维护方程,并且用线段树合并来维护。
大概有几种情况可以直接维护。
一种是对于前缀和后缀求和之类的。在线段树合并的过程中实时维护前缀后缀和之类的。
一种是子树加在一起。显然是可以直接维护的。
P5298 [PKUWC2018] Minimax
首先设 表示第 个点的权值为 的概率。
如果一个点是叶子,那么直接设初值。
否则,如果只有一个叶子,那么 直接全都等于这个儿子。
如果有两个儿子,那么假设 分别表示左右儿子。那么
我们可以观察到是 的前缀和乘上一个数加上 的后缀和乘上一个数乘 的单点, 的单点乘上另外一边的前缀后缀和。
然后我们可以在两棵线段树合并的时候顺便维护这个东西,维护 表示左儿子前缀后缀和,右儿子前缀后缀和。然后递归到叶子节点的时候 中有一个有值就更新答案。因为权值互不相同所以线段是的叶子节点只有一边可能有值。
最后在根节点维护答案即可。
P6773 [NOI2020] 命运
喵喵题
状态也不好想。
状态是 表示假设 的子树之外已经确定了,从 向祖宗找,只考虑下面的点在子树里,上面的点在子树外,最近的没有被满足的点的深度为 的方案数。
那么考虑转移。考虑将 子树合并到 子树上。那么就考虑 这条边的权值。如果这条边是重要的,那么只有可能是原来 子树上的限制导致的未满足。否则就是两个子树未满足的限制是最大值。
然后还是考虑在线段树合并的时候维护这些。第一项需要 子树的和,在线段树合并之前算出来即可。第二项和第三项需要在边递归的过程中边计算贡献,到叶子节点的时候需要增加贡献。
P4365 [九省联考 2018] 秘密袭击 coat
题意:树上所有联通块中第 大的点权之和。如果不足 个数,算成 。
sol:首先是我想要学会的 trick
这一步不是很好理解
这样对于每一个 ,如果 ,只会被计算一次,,只会被计算 次,以此类推,就相当于在和式前面乘 。
, 指集合中大于等于 的数出现次数。
然后设 DP 方程 表示 为根的子树, 为 时的方案数。
显著的,这是一个背包。
但是背包直接转移时 的。
我们考虑将背包写成生成函数的形式
这样
最终答案就是
我们假设
容易得到
然后答案就是
即使这样, 都是多项式还是很难求。
所以我们考虑求出 的 个点值,这样就拉插一下就能求出系数了。
然后求这个东西就是线段树了。线段树上维护一个矩阵乘法状的东西,然后就能一起维护 的值。
其实不会证明复杂度。但是人傻常数大。
本文作者:cc0000
本文链接:https://www.cnblogs.com/cc0000/p/17435814.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步