Loading

猫树

immortalCO的博客

“一种高效处理无修改区间或树上询问的数据结构”
lxl反对用猫树这个名字,并且认为这个名字就像ODT一样奇怪,可能叫“二区间合并”更好一些。

猫树的优势在于询问的时候可以做到 \(O(1)\),比线段树少一个 \(\log\),但是做不了修改操作。

猫树形如点分治,每次取当前区间的中点,分别记录从中点出发,向左向右的“中缀和”。然后递归地对左右区间进行相似操作,时空复杂度都为 \(O(n\log n)\)。

查询时找到一个查询区间中间的记录点,然后利用已知的中缀和把左端点到中间,中间到右端点两个区间的答案合并起来就行了。这也就是为什么这个算法也被叫做二区间合并。

查询为了做到 \(O(1)\),需要一点位运算的技巧。具体地,数组的下标从 \(0\) 开始,那么两个端点的二进制最长前缀长度就是其所在区间的深度。根据深度和左右端点我们就能 \(O(1)\) 确定记录点。

(二进制lcp求法:\(x>>\log_2(x \text{ xor } y)\))

posted @ 2022-02-09 01:21  pjykk  阅读(355)  评论(0)    收藏  举报