题意简述
维护序列,支持:
- 区间推平。
- 区间查询出现频率不小于 $p%$ 的数,保证有解。
$n, m\ge 1.5\times 10^5, 20\le p\le 100$。
主要思路
先考虑 $p = 50$。
这便是一个经典问题:长度为 $n$ 的数列中存在一个出现次数不小于 $n/2$ 的数,设计一个算法找到它。
只要每次删除两个不同的数,最后留下的那个数(或那些数,但这些数全部相同)就是要求的答案。
原理是,如果一个数出现了 $a$ 次,其中 $a\ge n−a$。
则两边都减去 $1$,仍有 $a−1\ge n−a−1=(n−2)−(a−1)$。
拓展情况可以如法炮制。令 $k = \lfloor\dfrac{100}{p}\rfloor$,则每次删除 $k + 1$ 个数,则对的数一定会留下来。
两个区间合并的过程显然可以 $O(k^2)$ 一堆分类讨论。上棵线段树,做完了,时间复杂度 $O(n k^2\log n)$。
参考代码
1 |
|