在比线性时间更快的时间内找到满足属性的范围

时间:2017-02-10 20:49:31

标签: algorithm data-structures segment-tree range-query

给定数组A [],我们需要找到一个具有最大大小且其最小元素为> = 1的范围。我们还需要通过将其所有元素减少1来更新此范围。

我得到的一个想法是保留一个段树以进行有效更新。但是我如何得到< =对数时间?

的范围

也许我们可以在这里使用二进制搜索。

由于

1 个答案:

答案 0 :(得分:1)

这是一个非常有趣的问题,我认为可以使用细分树来解决。

这是我的想法(我希望它足够快):

对于每个细分,我们需要存储4个信息:

  • 最左边的数字索引< 1
  • 最右边的数字索引< 1
  • 此细分受众群的最大尺寸(存储为范围a和b)
  • lazy flag(true / false)

当我们想查询最大大小时,我们可以进行递归调用来计算最终答案。 假设我们的方法是calcAnswer(左,右)。

resA = calcAnswer(左,中);

resB = calcAnswer(mid + 1,right);

最大尺寸为max(resA.max_size,resB.max_size,combine(resA.right_index,resB.left_index))。

如果数组A []中的元素数量很少(N <= 50000),我们可以使用Mo's Algorithm