Algorithm 范围最小查询<;O(n)、O(1)>;方法(最后步骤)

Algorithm 范围最小查询<;O(n)、O(1)>;方法(最后步骤),algorithm,rmq,Algorithm,Rmq,从我的最后一个问题“”继续(建议阅读) 再一次,从TopCoder开始,我这里那里都有一些问题,我希望有人能解决它们 所以我将RMQ(范围最小查询)问题转换为LCA(最低共同祖先)问题,然后再转换回来,我可以得到一个简化的数组。(这两种转换都可以在教程中找到,简化的数组是“从LCA到RMQ”中讨论的数组L) 无论如何,我可以通过Euler Tour得到这个数组,这是所有计算的核心部分 首先,我需要使整个数组只包含1和-1,从而使它变得更简单,所以这就是我要做的:Ls[I]=L[I]-L[I-1]

从我的最后一个问题“”继续(建议阅读)

再一次,从TopCoder开始,我这里那里都有一些问题,我希望有人能解决它们

所以我将RMQ(范围最小查询)问题转换为LCA(最低共同祖先)问题,然后再转换回来,我可以得到一个简化的数组。(这两种转换都可以在教程中找到,简化的数组是“从LCA到RMQ”中讨论的数组L)

无论如何,我可以通过Euler Tour得到这个数组,这是所有计算的核心部分

首先,我需要使整个数组只包含1和-1,从而使它变得更简单,所以这就是我要做的:
Ls[I]=L[I]-L[I-1]

第二步实际上是分区,这很简单,但第三步让我很困惑

设A'[i]为A中第i个块的最小值,B[i]为 该最小值在A中的位置

A指的是这个句子中的L数组,所以最小值总是1或-1,有多个1和-1。这让我很困惑,因为我不认为这会使计算更容易

第四步

现在,我们使用第1节中描述的ST算法对A'进行预处理。 这将需要O(N/l*log(N/l))=O(N)个时间和空间

如果“A”只保留1和-1的记录,那么在上面做任何事情似乎都是无用的

最后一步,

要索引表p,请预处理A中每个块的类型并将其存储 在数组T[1,N/l]中。块类型是通过以下方式获得的二进制数: 将-1替换为0,将+1替换为1

这是什么意思?计算每种组合?比如,
000
-
001
-


看起来有很多问题,但我希望有人能带我走完最后这些步骤。谢谢

希望这有助于解释问题

A指的是这个句子中的L数组,所以最小值总是1或-1,有多个1和-1。这让我很困惑,因为我不认为这会使计算更容易

我认为作者在这里混淆了术语。在这种情况下,我认为arrayA指的是原始值的数组,它们在被预处理为-1和+1之前。这些值最好放在周围,因为为原始数组的每个块计算最小值可以大大加快RMQ的执行速度。稍后再谈。现在,不要担心+1和-1值。他们晚些时候开始比赛

如果“A”只保留1和-1的记录,那么在上面做任何事情似乎都是无用的

没错。然而,这里A'保存了每个块在预处理为-1和+1值之前的最小值,所以这实际上是一个需要解决的有趣问题。同样,-1和+1步骤还没有发挥作用

要索引表p,请预处理A中每个块的类型,并将其存储在数组T[1,N/l]中。块类型是通过将-1替换为0和将+1替换为1而获得的二进制数

这就是-1和+1值的作用。这一步背后的关键思想是,对于较小的块大小,块中没有太多可能的-1和+1组合。例如,如果块大小为3,则可能的块为

---
--+
-+-
-++
+--
+-+
++-
+++
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
这里,我用+和-来表示+1和-1

你正在读的这篇文章给出了以下技巧。使用二进制0和1,而不是使用-1和+1。这意味着可能的块是

---
--+
-+-
-++
+--
+-+
++-
+++
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
这一方案的优点是双重的。首先,因为只有有限多个块,所以可以为每个可能的块预计算该块中任何一对索引的RMQ答案。其次,由于每个块都可以解释为一个整数,因此可以将这些问题的答案存储在一个由整数键入的数组中,其中每个整数是通过将块的-1和+1值转换为0和1得到的


希望这有帮助

一个简单的问题是,如何在fast中获得最小值?还有一个老派的线性比较法,够好吗?@ShaneHsu-Yep,那很好。所有块的总大小都是O(n),因此没有理由担心这一点。几乎就在此时,我对query有疑问,如果你想看一下的话,[rmq]中有一个问题。“因此,对于大小为l的每个二进制块,我们需要在表P中锁定每对索引之间的rmq值。这可以在O(sqrt(n)中轻松计算出来。”*l2)=O(N)时间和空间“如何?”ShaneHsu-如果你能解RMinQ,你总是可以通过求所有值的反,然后在新数组上解RMinQ来解RMaxQ。