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