众所周知对于区间静态众数我们有经典曾经的洛谷水黑题「蒲公英」。
众所周知那一题的做法是分块,预处理块到块的众数,预处理块内某个值出现次数的前缀和,用散块的值尝试更新众数。
但是注意到一点:设整块到整块内的众数出现次数为 ans,当尝试用散块更新的时候,我们真的需要知道其出现次数吗?
容易发现经过散块,ans 的增量是 O(√n) 级别的,也就是说可以想个办法直接检查这个值能否使答案增加 1。
那么,若把每个值的出现位置存入 vector,则直接在 vector 里访问当前位置的后 ans 个出现位置是否在 [l,r] 内即可。
如此便得到了一个常数极小的 O(n√n) 解法(视 n,m 同阶)。
以及,用这个做法拿到了蒲公英的 Rank2(
代码:
1 |
|