【发布时间】:2013-01-24 22:21:02
【问题描述】:
接上一个问题“Range Minimum Query approach (from tree to restricted RMQ)”(推荐阅读)
再次,来自 TopCoder 上的this tutorial,我在这里和那里有几个问题,希望有人能解决它们。
所以我将 RMQ(范围最小查询)问题转换为 LCA(最低公共祖先)问题,然后将其转换回来,我可以得到一个简化的数组。 (两种变换都可以在教程中找到,简化的数组是“从LCA到RMQ”中讨论的数组L)
不管怎样,我可以通过欧拉图得到那个数组,这是所有计算的核心部分。
首先,我需要通过使整个数组仅包含 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 -.....?
这看起来像是多个问题,但我希望有人可以指导我完成最后这些步骤。谢谢!
【问题讨论】: