CF1856E2 PermuTree (hard version) 题解

CF1856E2

默认已会 E1。

考虑对 E1 进行优化,发现瓶颈在于背包。

设当前子树以 $u$ 为根,容易发现 $\sum siz_{v_i}=siz_u-1$,显然要从这里下手。发现总值域较小是与普通背包不同的地方,要么个数少,要么值域小。不妨设背包的总容量为 $W$,则超过 $\sqrt{W}$ 的数不超过 $\sqrt{W}$ 个,即不同的物品最多只有 $\sqrt{W}$ 个,可直接化为多重背包,二进制拆分后再使用 bitset 即可,但这里比较特殊,时间复杂度为 $\dfrac{m\sqrt{m}}{w}$。

但这个复杂度依然是错误的,当树退化为一条链时就会被卡死。

类似于树剖的思想,当其重儿子的 $siz$ 大于等于 $\lfloor\dfrac{siz_u-1}{2}\rfloor$ 时可以直接 $\mathcal{O}(1)$ 做,否则就像前一种方法,但这时候所有的点的 $siz$ 都至少会变为 $siz_u$ 的一半,根据主定理,易得时间复杂度为 $\mathcal{O}(\dfrac{m\sqrt{m}}{w})$。

关于这里的多重背包的时间复杂度的具体证明可以看这篇

评测记录

posted @ 2023-08-12 19:58  Pengzt  阅读(1)  评论(0编辑  收藏  举报  来源