范围最值查询(RMQ)
RMQ的一般形式表述为:对于长度为n的数列A,查询q(l, r),返回A[l…r]之间的最大值(最小值等)。
POJ 3368
Portal: http://poj.org/problem?id=3368
题意:
有一个单调不减的序列a[n], 问子序列a[l…r]中,出现次数最多的数的出现次数(好像有点拗口,还是看例子吧)。
比如:序列为 -1 -1 1 1 1 1 3 10 10 10
,a[5…10]中,出现次数最多的数是10,它的出现次数是3,所以要输出3。
解题思路:
算是比较直白的RMQ模板题。对于区间a[l...r]
,如果a[l]这个数在此前的序列中没有出现过,那么问题就可以简单地转化为RMQ的基本形式,即查询l到r的区间内出现次数的最大值。这里只要把a[l]在此前序列中已经出现的情况考虑一下即可。
对于上述序列,我们先定义长度为n的数列freq
,表示这个数已经出现的次数,即1 2 1 2 3 4 1 1 2 3
。此序列用于前面所述的纯RMQ过程。
如果a[l]在此前已经出现过,那么就把序列分成a[l...t]
和a[t+1...r]
两部分,其中a[l…r]中的数都是a[l]。最后答案取max(t-l+1, RMQ(t+1, r))
。
代码:
|
|
此方法可以AC,但是还有一些优化空间。因为freq序列有良好的部分单调性。