【二进制拆分】【bitset】【主定理】

发布时间 2023-10-18 09:34:30作者: Pengzt

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})\)

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

评测记录