所以,我读了这对RMQ(范围最小查询)TopCoder的教程中,我得到了一个很大的问题。
在那里他介绍了该部分的做法 ,有什么我能理解到现在为止是这样的:
(整个逼近实际使用中所介绍的方法稀疏表(ST)算法 , 从LCA还原成RMQ ,并从RMQ到LCA )
给定阵列的[N],我们需要将其变换到笛卡尔树,从而使一个RMQ问题LCA(最低共同祖先)的问题。 后来,我们可以得到数组A的简化版本,并使它成为一个受限制的RMQ问题。
因此,它基本上有两种变换。 所以第一RMQ到LCA部分是简单的。 通过使用堆栈,我们可以在O(n)的时间变换,从而产生一个阵列T [N],其中T [i]为i的元素的父。 和树完成。
但这里是我无法理解。 的O(n)的方法需要一个数组,其中|A[i] - A[i-1]| = 1
|A[i] - A[i-1]| = 1
,并且阵列在引入从LCA还原成RMQ教程的部分。 涉及此树的欧拉。 但是,这怎么能与来自变换我的最终结果能实现吗? 我给它的做法是不是线性的,所以应该在这种方法被认为是不好的,这将是这种线性的方法呢?
UPDATE:这让我困惑的点
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.
树的图片:
欧拉游需要知道每个节点的孩子,就像一个DFS(深度优先搜索),而T [N]只有每个元素的根,而不是孩子。