Loading docs/ds/seg.md +4 −4 Original line number Diff line number Diff line Loading @@ -496,13 +496,13 @@ int getsum(int l, int r, int s, int t, int p) { 但是有一个问题在于普通线段树的区间询问在某些毒瘤的眼里可能还是有些慢了。 简单来说就是线段树建树的时候需要做 $O(n)$ 次合并操作,而每一次区间询问需要做 $O(\log{n})$ 次合并操作,询问区间和这种东西的时候还可以忍受,但是当我们需要询问区间线性基这种合并复杂度高达 $O(\log^2{n})$ 的信息的话,此时就算是做 $O(\log{n})$ 次合并有些时候在时间上也是不可接受的。 简单来说就是线段树建树的时候需要做 $O(n)$ 次合并操作,而每一次区间询问需要做 $O(\log{n})$ 次合并操作,询问区间和这种东西的时候还可以忍受,但是当我们需要询问区间线性基这种合并复杂度高达 $O(\log^2{w})$ 的信息的话,此时就算是做 $O(\log{n})$ 次合并有些时候在时间上也是不可接受的。 而所谓 "猫树" 就是一种不支持修改,仅仅支持快速区间询问的一种静态线段树。 构造一棵这样的静态线段树需要 $O(n\log{n})$ 次合并操作,但是此时的查询复杂度被加速至 $O(1)$ 次合并操作。 在处理线性基这样特殊的信息的时候甚至可以将复杂度降至 $O(n\log^2{n})$ 。 在处理线性基这样特殊的信息的时候甚至可以将复杂度降至 $O(n\log^2{w})$ 。 ### 原理 Loading @@ -516,7 +516,7 @@ int getsum(int l, int r, int s, int t, int p) { 由于 $p$ 是 $l$ 和 $r$ 的 lca,这意味着 $p$ 的左儿子是 $l$ 的祖先而不是 $r$ 的祖先, $p$ 的右儿子是 $r$ 的祖先而不是 $l$ 的祖先。 因此 $l$ 一定在 $[L,MID]$ 这个区间内, $r$ 一定在 $[MID,R]$ 这个区间内。 因此 $l$ 一定在 $[L,MID]$ 这个区间内, $r$ 一定在 $(MID,R]$ 这个区间内。 有了这两个性质,我们就可以将询问的复杂度降至 $O(1)$ 了。 Loading Loading @@ -554,7 +554,7 @@ int getsum(int l, int r, int s, int t, int p) { 这样我们就完成了一个猫树。 由于建树的时候涉及到求前缀和和求后缀和,所以对于线性基这种虽然合并是 $O(\log^2{n})$ 但是求前缀和却是 $O(n\log{n})$ 的信息,使用猫树可以将静态区间线性基从 $O(n\log^2{n}+m\log^3{n})$ 优化至 $O(n\log^2{n}+m\log^2{n})$ 的复杂度。 由于建树的时候涉及到求前缀和和求后缀和,所以对于线性基这种虽然合并是 $O(\log^2{w})$ 但是求前缀和却是 $O(n\log{n})$ 的信息,使用猫树可以将静态区间线性基从 $O(n\log^2{w}+m\log^2{w}\log{n})$ 优化至 $O(n\log{n}\log{w}+m\log^2{w})$ 的复杂度。 ### 参考 Loading Loading
docs/ds/seg.md +4 −4 Original line number Diff line number Diff line Loading @@ -496,13 +496,13 @@ int getsum(int l, int r, int s, int t, int p) { 但是有一个问题在于普通线段树的区间询问在某些毒瘤的眼里可能还是有些慢了。 简单来说就是线段树建树的时候需要做 $O(n)$ 次合并操作,而每一次区间询问需要做 $O(\log{n})$ 次合并操作,询问区间和这种东西的时候还可以忍受,但是当我们需要询问区间线性基这种合并复杂度高达 $O(\log^2{n})$ 的信息的话,此时就算是做 $O(\log{n})$ 次合并有些时候在时间上也是不可接受的。 简单来说就是线段树建树的时候需要做 $O(n)$ 次合并操作,而每一次区间询问需要做 $O(\log{n})$ 次合并操作,询问区间和这种东西的时候还可以忍受,但是当我们需要询问区间线性基这种合并复杂度高达 $O(\log^2{w})$ 的信息的话,此时就算是做 $O(\log{n})$ 次合并有些时候在时间上也是不可接受的。 而所谓 "猫树" 就是一种不支持修改,仅仅支持快速区间询问的一种静态线段树。 构造一棵这样的静态线段树需要 $O(n\log{n})$ 次合并操作,但是此时的查询复杂度被加速至 $O(1)$ 次合并操作。 在处理线性基这样特殊的信息的时候甚至可以将复杂度降至 $O(n\log^2{n})$ 。 在处理线性基这样特殊的信息的时候甚至可以将复杂度降至 $O(n\log^2{w})$ 。 ### 原理 Loading @@ -516,7 +516,7 @@ int getsum(int l, int r, int s, int t, int p) { 由于 $p$ 是 $l$ 和 $r$ 的 lca,这意味着 $p$ 的左儿子是 $l$ 的祖先而不是 $r$ 的祖先, $p$ 的右儿子是 $r$ 的祖先而不是 $l$ 的祖先。 因此 $l$ 一定在 $[L,MID]$ 这个区间内, $r$ 一定在 $[MID,R]$ 这个区间内。 因此 $l$ 一定在 $[L,MID]$ 这个区间内, $r$ 一定在 $(MID,R]$ 这个区间内。 有了这两个性质,我们就可以将询问的复杂度降至 $O(1)$ 了。 Loading Loading @@ -554,7 +554,7 @@ int getsum(int l, int r, int s, int t, int p) { 这样我们就完成了一个猫树。 由于建树的时候涉及到求前缀和和求后缀和,所以对于线性基这种虽然合并是 $O(\log^2{n})$ 但是求前缀和却是 $O(n\log{n})$ 的信息,使用猫树可以将静态区间线性基从 $O(n\log^2{n}+m\log^3{n})$ 优化至 $O(n\log^2{n}+m\log^2{n})$ 的复杂度。 由于建树的时候涉及到求前缀和和求后缀和,所以对于线性基这种虽然合并是 $O(\log^2{w})$ 但是求前缀和却是 $O(n\log{n})$ 的信息,使用猫树可以将静态区间线性基从 $O(n\log^2{w}+m\log^2{w}\log{n})$ 优化至 $O(n\log{n}\log{w}+m\log^2{w})$ 的复杂度。 ### 参考 Loading