OSDN Git Service

remove from rmq
authorsshwy <jy.cat@qq.com>
Fri, 30 Aug 2019 13:43:00 +0000 (21:43 +0800)
committersshwy <jy.cat@qq.com>
Fri, 30 Aug 2019 13:43:00 +0000 (21:43 +0800)
docs/ds/cartesian-tree.md
docs/topic/rmq.md

index 2006a5e..867dc9d 100644 (file)
 
 ![build](./images/cartesian-tree2.png)
 
-显然每个数最多进出右链一次(或者说每个点在右链中存在的是一段连续的时间)。这个过程我们可以用栈维护,栈中维护当前笛卡尔树的右链上的结点。一个点不在右链上了就把它弹掉。这样每个点最多进出一次,复杂度 $O(n)$ 。
+显然每个数最多进出右链一次(或者说每个点在右链中存在的是一段连续的时间)。这个过程我们可以用栈维护,栈中维护当前笛卡尔树的右链上的结点。一个点不在右链上了就把它弹掉。这样每个点最多进出一次,复杂度 $O(n)$ 。伪代码如下:
+
+```text
+新建一个大小为n的空栈。
+For i:=1 to n
+    flag = 0
+    While 栈不为空
+        if 栈顶元素<当前元素
+            栈顶元素.右儿子=当前元素
+            break
+        else
+            栈顶元素.右儿子=当前元素.左儿子。
+            当前元素.左儿子=栈顶元素
+            栈顶元素出栈
+        当前元素入栈。
+```
 
 ## 笛卡尔树与 Treap
 
index 657b338..8397799 100644 (file)
@@ -51,37 +51,11 @@ Four russian 是一个由四位俄罗斯籍的计算机科学家提出来的基
 
     这样子我们只需要在询问的时候进行至多一次 ST 表上的查询操作了。
 
-## 笛卡尔树以及其构造
-
-在实现更加优秀的时间复杂度之前,我们先来介绍一个数据结构:笛卡尔树。
-
-笛卡尔树  (Cartesian tree) 的本质是一个二叉小根/大根堆。同时笛卡尔数满足对其中序遍历的结果等于原来的数组 A。
-
-下面是一个笛卡尔树的具体例子:
-
-![](./images/rmq1.jpg)
-
-接下来笔者将讲述一个构造笛卡尔树的 $O(n)$ 算法。
-
-```text
-新建一个大小为n的空栈。
-For i:=1 to n
-    flag = 0
-    While 栈不为空
-        if 栈顶元素<当前元素
-            栈顶元素.右儿子=当前元素
-            break
-        else
-            栈顶元素.右儿子=当前元素.左儿子。
-            当前元素.左儿子=栈顶元素
-            栈顶元素出栈
-        当前元素入栈。
-```
-
-由于一个元素只会入栈一次,出栈一次,所以总复杂度为 $O(n)$ 。
 
 ## 笛卡尔树在 RMQ 上的应用
 
+不了解笛卡尔树的朋友请移步[笛卡尔树](../ds/cartesian-tree.md)。
+
 我们发现,原序列上两个点之间的 min/max,等于笛卡尔树上两个点的 LCA 的权值。
 
 这也说明,我们现在需要去解决的是如何 $O(n)-O(1)$ 树上两个点之间的 LCA 的。