sqrt technology?
传送门
题解
题目名字告诉你应该用分块。
首先可以$O(n\sqrt{n})$地预处理出块与块之间的众数的出现次数。
然后对于每一种数字,开一个vector,存下每次出现的位置。
并记录下每个位置的数字在vector中的下标。
询问的时候,中间完整的几块直接调用预处理出的出现次数,把这个出现次数作为答案的初值。
然后考虑两边不完整的块该如何处理。
设询问的区间为$[L,R]$,先考虑左侧不完整的块,设$pos[i][j]$表示数字$i$第$j$次出现时在原序列中的位置。$vec[i]$表示第$i$个位置上的数字在$pos$数组中的第二个下标,如果满足$pos[A[i]][vec[i]+ans]<=R$,那么说明当前的答案偏小了,执行$ans++$。右侧同样处理。
总时间复杂度仍为$O(n\sqrt{n})$。
代码
1 |
|