NOIP2024集训Day27 DP常见模型4 - 树形

NOIP2024集训Day27 DP常见模型4 - 树形


C. [ARC101E] Ribbons on Tree

直接容斥。题目要求每一条边都被覆盖,那么我们就容斥至少有几条边没有被覆盖。

那么没有被覆盖的几条边一个可以把整棵树划分成很多连通块,每一块的贡献就是 \(g(sz - 1)\),定义 \(g(x) = x(x-2)(x-4)\cdots\)

然后就可以 dp 了。

\(f_{x, i, j}\) 表示以 \(x\) 为根的子树内,\(x\) 位于一个大小为 \(i\) 的联通块,子树内有 \(j\) 条边没有被覆盖时,各种方案各个连通块的贡献之和。由于 \(x\) 所在的连通块还没有完结,所以 \(f\) 数组不算上 \(x\) 所在连通块的贡献。(方案还是要算的)

然后就是一个基础的背包合并。复杂度大概是 \(\Theta(n^4)\)

可以发现,最后容斥的时候,我们只关心 \(j\) 的奇偶性,不关心 \(j\) 到底是几。于是我们可以把 \(j\) 那一维缩减成 \(0/1\) 的状态。

于是就是一个常规的背包合并的复杂度了,\(\Theta (n^2)\)


D. [AGC034E] Complete Compress

可以枚举根。

然后把某两棵棋子同时往深度浅的方向提,即对不存在祖先关系的两个棋子进行操作。

如果能到达那么就更新答案。

问题转化为如何判定能够到达。

考虑对于某一个节点,合法的条件是什么。

\(f_u\) 为以 \(u\) 为根的子树中的棋子还需要移动多少步,容易发现对于节点 \(u\) 的所有孩子 \(v\),若存在一个 \(x\)\(f_x \gt (\sum f_v) - f_x\),那么 \(f_x\) 一定不能移动完。

然后根据这个东西随便 DP 转移一下就行。


E. [COCI2014-2015#1] Kamp

首先只考虑一个点,发现如果回到原来位置是比较好搞的,就每次走完子树的里面要的就上来,如果子树里面没有要走的就不走。

(大概是 \(f_x = \sum f_y + 2\cdot e_x\),因为要走过去走回来,注意 \(y\) 要保证子树里面有人)

至于多个点换根 DP 即可。

然后考虑不走回来,那你少了的长度就是从最后一个人走回自己的距离。
那贪心的选离你最远的,思考一下发现是可以的因为可以最晚走到的条件是子树内除了自己没有人,安排一下子树的遍历顺序即可。

那这个对于每个点求距离它最远的人其实不难,就分成子树内和子树外,子树内好统计,子树外就维护子树内次小(不能跟最小在同一个儿子里面),然后要么从上面的 up 下来,要么在你这里开始往下(因为不能自己上自己下所以要维护次小)

posted @ 2024-09-12 16:18  Leirt_Abu  阅读(32)  评论(0)    收藏  举报