回滚莫队如何做到在询问区间中删除一些散点

C. Cut Tree
给一棵有正数点权的树,每次询问给定 \(l,r,f\),问只加入标号在 \([l,r]\setminus\{f\}\) 中的边时,点权和最大的连通块的点权和。
先把根号 log 卡常的全杀了 /fn
不难发现直接回滚莫队拼 P5311 就解决了,但是这个做法

实际上有不依赖树上连通块性质的做法,也就是说所有回滚莫队题都可以这样询问。。。
每次询问是临时删点的形式,而对莫队的操作序列线段树分治肯定要带 log,那就只有操作分块了,
考虑在回滚莫队里强行做一个操作分块:
在正常的回滚莫队中,对于左端点在同一块中的若干询问,暴力做掉左右端点同块的询问后,需要扫描右端点并对每个询问加入左边的贡献,
而我们暴力做掉左右端点同块的询问后,把剩下的询问分成大小为 \(B\) 的块,
对每个块,标记块内的询问删掉的所有边,然后扫描右端点,扫描过程中忽略标记的边,并对每个询问加入左边的贡献、标记的边中没被删掉的边的贡献即可,
这样每个询问分块可以在 \(O((n+B^2)\alpha(n))\) 的复杂度内解决,共有 \(m/B\) 个询问分块,于是总复杂度 \(O((nm/B+mB)\alpha(n))\),
取 \(B=\sqrt n\),总复杂度 \(O(m\sqrt n\alpha(n))\)。


浙公网安备 33010602011771号