CF1856E2 PermuTree (hard version) 题解
默认已会 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})$。
关于这里的多重背包的时间复杂度的具体证明可以看这篇