猫树分治(二区间合并)小记
主要用途:静态,离线的区间询问可以更快。
考虑线段树的区间查这个问题。
先把序列补成 \(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
一样的。

浙公网安备 33010602011771号