给定数组A [],我们需要找到一个具有最大大小且其最小元素为> = 1的范围。我们还需要通过将其所有元素减少1来更新此范围。
我得到的一个想法是保留一个段树以进行有效更新。但是我如何得到< =对数时间?
的范围也许我们可以在这里使用二进制搜索。
由于
答案 0 :(得分:1)
这是一个非常有趣的问题,我认为可以使用细分树来解决。
这是我的想法(我希望它足够快):
对于每个细分,我们需要存储4个信息:
当我们想查询最大大小时,我们可以进行递归调用来计算最终答案。 假设我们的方法是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。