OSDN Git Service

fix cartesian
authorsshwy <jy.cat@qq.com>
Fri, 30 Aug 2019 13:30:04 +0000 (21:30 +0800)
committersshwy <jy.cat@qq.com>
Fri, 30 Aug 2019 13:30:04 +0000 (21:30 +0800)
docs/ds/cartesian-tree.md

index 6ca4ba9..2006a5e 100644 (file)
@@ -12,9 +12,7 @@
 
 ## 构建
 
-既然笛卡尔树有具有两种不同结构的性质,那么就有两种构建方法。其中一种的复杂度是 $O(n)$ ,另一种是 $O(n\log n)$ 。
-
-### 栈构建
+## 栈构建
 
 我们考虑将元素按照键值 $k$ 排序。然后一个一个插入到当前的笛卡尔树中。那么每次我们插入的元素必然在这个树的右链(右链:即从根结点一直往右子树走,经过的结点形成的链)的末端。于是我们执行这样一个过程,从下往上比较右链结点与当前结点 $u$ 的 $w$ ,如果找到了一个右链上的结点 $x$ 满足 $x_w<u_w$ ,就把 $u$ 接到 x 的右儿子上,而 x 原本的右子树就变成 u 的左子树。
 
 
 显然每个数最多进出右链一次(或者说每个点在右链中存在的是一段连续的时间)。这个过程我们可以用栈维护,栈中维护当前笛卡尔树的右链上的结点。一个点不在右链上了就把它弹掉。这样每个点最多进出一次,复杂度 $O(n)$ 。
 
-## 另一种构建
-
-还有一种构建方式与之对应。我们按照 $w$ 排序,始终维护堆的结构。这样插入一个结点,相当于添加一个叶子结点。于是我们像平衡树那样插入就行了。这样每一次插入的复杂度是 $O(\log n)$ 的,因此总复杂度是 $O(n\log n)$ 的。
-
 ## 笛卡尔树与 Treap
 
 谈到笛卡尔树,很容易让人想到一种家喻户晓的结构——Treap。没错,Treap 是笛卡尔树的一种,只不过 w 的值完全随机。Treap 也有线性的构建算法,如果提前将元素排好序,显然可以使用上述单调栈算法完成构建过程,只不过很少会这么用。