RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
以上内容出自某百科,大体是RMQ的理性认识。说白了,RMQ就是一种查询区间最值的good way
其实用O(n)的效率查找也不是不可以,但当区间长度较长,讯问次数又较多时,就会猥琐了
但是RMQ只是用(n log n)的效率预处理后,查询时只需O(1)的效率就可以了
那么怎么与处理呢?
我们用f[i][j]表示第i个点往后2^j个范围之中的最值。所以f[i][j]就可以表示为f[i][j]=min或max(f[f[i][j-1]][j-1],f[i][j-1])。
那么有了f数组,该如何查询呢?
其中有一个关键点就是,如果两段范围重合了的话,那这两段范围加起来的范围之中的最值就是这两段之中最值相对更大(或更小)的那个。比如我们要求[l,r]之间的最值,那么我们选一个以l开头的范围和一个以r结束的范围,于是就有了max或min(f[i][k],f[l-2^k+1][k])。
一段核心代码,是gty大神的代码图片,需要说明的是其中”1<< j“表示的是2^j,思路有了就很好写了,还是自己写写吧