Loading

猫树分治(二区间合并)小记

主要用途:静态,离线的区间询问可以更快。

考虑线段树的区间查这个问题。

先把序列补成 \(2\) 的整幂,每个点代表 \((l, r]\),使用堆式建树,则只需要知道 \([x, x]\)\([y, y]\) 所代表的节点的 LCA,LCA 的编号为两个点二进制下编号的 LCP,\(x, y\) 在二进制下的 lcp(x, y) = x >> dights[x ^ y],其中 dights[x] 表示二进制下 \(x\) 的位数。

求出 LCA 后,由于 LCA 一定包含 \([x, y]\),且 \([x, y]\) 跨越其区间中点 \(mid\),对于每个点记录 \((l, mid]\) 的后缀和和 \((mid, r]\) 的前缀和,然后就查询线性,建树和空间复杂度多了个 \(\log\) 了。

那么这个就是猫树分治的思想:取中点分治之后,处理左边和右边再合并。要求是信息可以合并。

P6240

背包 \(f_s\) 可以看做 \({\max, +}\) 卷积,可以合并,套用猫树分治即可,时间复杂度 \(\mathcal{O}(qt + nt \log n)\)

P6109

一样的。

posted @ 2026-01-04 10:12  循环一号  阅读(4)  评论(0)    收藏  举报