题意
给出一个长度为 n n n 的序列,有 m m m 次询问,每次询问给出 [ l , r ] [l,r] [l,r],求区间众数。强制在线。
n , m ≤ 500000 n,m\leq 500000 n,m≤500000。
分析
首先对 a i a_i ai 离散化,现在值域变成了 [ 1 , n ] [1,n] [1,n]。
考虑分块。
首先,设 f i , j f_{i,j} fi,j 表示第 i i i 块到第 j j j 块之间的众数,这个可以在 O ( n n ) O(n\sqrt{n}) O(nn) 求出。具体做法是对于每一个块, O ( n ) O(n) O(n) 扫一遍求出众数。
然后,询问的时候,众数只可能有两种情况:
- 众数不是不完整块中的数
此时答案就是 f b l l + 1 , b l r − 1 f_{bl_{l}+1,bl_{r}-1} fbll+1,blr−1。 - 众数是不完整块中的数
首先设答案初值为 f b l l + 1 , b l r − 1 f_{bl_{l}+1,bl_{r}-1} fbll+1,blr