For i->1 to n
flag = 0
While 栈不为空
- if 栈顶元素<当前元素
- 栈顶元素.右儿子=当前元素
- break
- else
- 栈顶元素.右儿子=当前元素.左儿子。
- 当前元素.左儿子=栈顶元素
- 栈顶元素出栈
- 当前元素入栈。
+ if 栈顶元素<当前元素
+ 栈顶元素.右儿子=当前元素
+ break
+ else
+ 栈顶元素.右儿子=当前元素.左儿子。
+ 当前元素.左儿子=栈顶元素
+ 栈顶元素出栈
+ 当前元素入栈。
```
由于一个元素只会入栈一次,出栈一次,所以总复杂度为 $O(n)$ 。
由于 Four russian 算法的瓶颈在于块内 RMQ 问题,我们重点去讨论块内 RMQ 问题的优化。
-由于相邻两个数字的差值为 $\pm 1$ ,所以在固定左端点数字时 长度不超过 $\log n$ 的右侧序列种类数为 $\Sigma_{i=1}^{i \leq \log n} 2^{i-1}$ ,而这个式子显然不超过 $n$ 。
+由于相邻两个数字的差值为 $\pm 1$ ,所以在固定左端点数字时 长度不超过 $\log n$ 的右侧序列种类数为 $\sum_{i=1}^{i \leq \log n} 2^{i-1}$ ,而这个式子显然不超过 $n$ 。
这启示我们可以预处理所有不超过 $n$ 种情况的 最小值 - 第一个元素 的值。