因此,我阅读了有关 RMQ(范围最小查询)的 TopCoder 教程,我遇到了一个大问题。
在他介绍方法的部分,到目前为止我能理解的是:
(整个方法实际上使用了稀疏表(ST)算法中引入的方法,从 LCA 到 RMQ以及从 RMQ 到 LCA的缩减)
给定一个数组 A[N],我们需要将其转换为笛卡尔树,从而使 RMQ 问题成为 LCA(最低公共祖先)问题。稍后,我们可以得到数组 A 的简化版本,并使其成为受限 RMQ 问题。
所以它基本上是两个转换。所以第一个 RMQ 到 LCA 部分很简单。通过使用堆栈,我们可以在 O(n) 时间内进行转换,得到一个数组 T[N],其中 T[i] 是元素 i 的父元素。树就完成了。
但这是我无法理解的。O(n) 方法需要一个数组 where |A[i] - A[i-1]| = 1
,并且该数组在本教程的从 LCA 到 RMQ 的缩减部分中进行了介绍。这涉及到这棵树的欧拉之旅。但是,如何通过转换的最终结果来实现呢?我的方法不是线性的,所以在这种方法中应该被认为是不好的,线性方法是什么?
更新:让我感到困惑的一点
Here's the array A[]:
n : 0 1 2 3 4 5 6 7 8 9
A[n]: 2 4 3 1 6 7 8 9 1 7
Here's the array T[]:
n : 0 1 2 3 4 5 6 7 8 9
T[n]: 3 2 0 * 8 4 5 6 3 8 // * denotes -1, which is the root of the tree
//Above is from RMQ to LCA, it's from LCA to RMQ part that confuses me, more below.
树的图片:
Euler Tour 需要知道每个节点的子节点,就像 DFS(深度优先搜索)一样,而 T[n] 只有每个元素的根,而不是子节点。