[POJ 3368]

Frequent values

说好的RMQ问题,结果又用线段树A了…

题意是:一个长度为n(1<=n<=100000)的非递减序列,共q(1<=1<=100000)次询问,求下标(l,h)范围内出现最频繁的元素的次数。 一开始照着RMQ问题想,还看了个ST算法(O(NlgN)预处理,O(1)在线查询),结果也没想明白怎么用。 又回头想了下,发现线段树是可以用的。由于序列非递减,连续的相同元素压缩成一个点作为线段树叶结点,记录元素在原数组中的下标范围;树分叉结点则保存子树下最频繁次数值,插入时则是按照压缩后的点编号进行处理,由此建树O(NlgN),每次查询是O(lgN)。