±1RMQ(约束RMQ)

来源:互联网 发布:淘宝店铺logo分辨率 编辑:程序博客网 时间:2024/06/05 06:16


±1RMQ其实是RMQ的一个特殊情况,它的特殊性体现在:序列中每两个相邻元素的差是1或-1。即:


对于这种特殊情况,有一种方法可以将RMQ的时间降至常数级别,即用的时间解决。


可以发现,如果LCA用DFS+RMQ的方法解决,则RMQ部分正好是±1RMQ。所以,如果会了这种方法,将可以用的时间处理LCA的在线询问。

这里简单(因为我不会)介绍一下:RMQ标准算法可以将原数列通过的时间建立成笛卡尔树,再转换成LCA,然后再用±1RMQ处理,则普通RMQ的时间复杂度也可以是。。。(好神奇)


回到正题。。。那么,±1RMQ该怎么做呢?

考虑分块,是否可以将序列分成b块,每一块都搞一次RMQ,然后大的也搞一次RMQ?

如图所示:

很明显,这样做是可以的。

则查询操作可分为三块,最左,最右边的块搞一次内部查询。然后中间所有块中再做一次块与块之间的查询操作。最后合并到一起即可。

如图:


分块的思路确定了。那么每个块的长度我们该如何确定呢?

是否可以将每块的长度len定为?如果这样就没有利用好+1,-1这个条件了。

在这里,我们设。则块数

注意到相邻的两个数只有+1,-1两个条件。根据乘法原理,最多只有种本质不同的情况。

那么,我们可以先预处理出所有本质不同的情况的所有答案,即每一种本质不同情况都做一次RMQ。易知,这样做的时间复杂度不超过常数级别。

做完RMQ预处理后,就可以根据每一块+1/-1的性质套进上面的情况中,加上偏移量offset即可。

记第i块的最小值为A'[i],然后根据序列A'做一次块间的RMQ即可。

则预处理的时间复杂度为。每次查询的时间复杂度为