接上我的上一个问题“Range Minimum Query approach (from tree to restricted RMQ)”(建议读一读)
再次,从TopCoder的this tutorial开始,我在这里和那里有几个问题,我希望有人可以清除它们。
因此,我将RMQ(范围最小查询)问题转换为LCA(最低公共祖先)问题,然后将其转换回来,我可以拥有一个简化的数组。 (两个转换都可以在教程中找到,简化的数组是在“从LCA到RMQ”中讨论的数组L)
无论如何,我可以使用Euler Tour获得该数组,这是所有计算的核心部分。
首先,我需要通过使整个数组只包含1和-1来使其更简单,所以这就是我所做的:Ls[i] = L[i] - L[i-1]
。
第二步实际上是分区,这很简单,但是第三步让我感到困惑。
设A'[i]为A和B [i]中第i个块的最小值 该最小值在A中的位置。
A指的是这个句子中的L数组,所以最小值总是1或-1,并且会有多个1和-1。这使我感到困惑,因为我认为这不会使计算更容易。
第四步,
现在,我们使用第1节中描述的ST算法预处理A'。 这将花费O(N / l * log(N / l))= O(N)时间和空间。
如果A'只保留1s和-1s的记录,那么对它做任何事都没用。
最后一步,
要索引表P,预处理A中每个块的类型并存储它 在数组T [1,N / l]中。块类型是通过获得的二进制数 用0代替-1,用1代替+1。
这是什么意思?要计算每种组合?比如,000
- 001
-.....?
看起来好像有多个问题,但我希望有人可以带我走完这些最后的步骤。谢谢!
答案 0 :(得分:5)
希望这有助于解释事情。
A指的是这个句子中的L数组,所以最小值总是1或-1,并且会有多个1和-1。这使我感到困惑,因为我认为这不会使计算更容易。
我认为作者在这里混淆了术语。在这种情况下,我相信数组 A 是指在将它们预处理为-1和+ 1之前的原始值数组。这些值很好,因为具有为原始数组的每个块计算的最小值使得执行RMQ要快得多。稍后会详细介绍。现在,不要担心+1和-1值。他们以后会发挥作用。
如果A'只保留1s和-1s的记录,那么对它做任何事都没用。
这是真的。但是,这里A'保存每个块之前的最小值它们已经被预处理为-1和+1值,所以这实际上是一个有趣的问题需要解决。同样,-1和+1步骤尚未发挥作用。
要索引表P,预处理A中每个块的类型并将其存储在数组T [1,N / l]中。块类型是通过将-1替换为0而使用1替换+1而获得的二进制数。
这是-1和+1值的来源。这一步骤背后的关键思想是,对于小块大小,块中-1和+ 1的可能组合并不多。例如,如果块大小为3,则可能的块为
---
--+
-+-
-++
+--
+-+
++-
+++
在这里,我使用+和 - 来表示+1和-1。
您正在阅读的文章提供了以下技巧。而不是使用-1和+1,使用二进制0和1.这意味着可能的块是
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
这种方案的优点是双重的。首先,由于只有有限数量的块,因此可以为每个可能的块预先计算该块内任何索引对的RMQ答案。其次,由于每个块都可以解释为整数,因此可以将这些问题的答案存储在由整数键控的数组中,其中每个整数都是通过将块的-1和+1值转换为0和1来获得的。
希望这有帮助!