【题解】洛谷P4168 [Violet]蒲公英 (分块)
D e s c r i p t i o n \rm Description Description
我们把所有的蒲公英看成一个长度为 n n n 的序列 { a 1 , a 2 . . a n a_1,a_2..a_n a1,a2..an},其中 a i a_i ai 为一个正整数,表示第 i i i 棵蒲公英的种类编号。
而每次询问一个区间 [ l , r ] [l,r] [l,r],你需要回答区间里出现次数最多的是哪种蒲公英,如果有若干种蒲公英出现次数相同,则输出种类编号最小的那个。
注意,你的算法必须是在线的。
输入格式
第一行有两个整数,分别表示蒲公英的数量 n n n 和询问次数 m m m。
第二行有 n n n 个整数,第 i i i 个整数表示第 ii 棵蒲公英的种类 a i a_i ai 。
接下来 m m m 行,每行两个整数 l 0 , r 0 l_0,r_0 l0,r0,表示一次询问。输入是加密的,解密方法如下:
令上次询问的结果为 x x x(如果这是第一次询问,则 x = 0 x = 0 x=0),设 l = ( ( l 0 + x − 1 ) m o d n ) + 1 , r = ( ( r 0 + x − 1 ) m o d n ) + 1 l=((l_0+x-1)\bmod n) + 1,r=((r_0+x-1) \bmod n) + 1 l=((l0+x−1)modn)+1,r=((r0+x−1)modn)+1。如果 l > r l>r l>r,则交换 l , r l, r l,r。
最终的询问区间为计算后的 [ l , r ] [l,r] [l,r]。
输出格式
对于每次询问,输出一行一个整数表示答案。
输入输出样例
输入
6 3
1 2 3 2 1 2
1 5
3 6
1 5
输出
1
2
1
数据规模与约定
对于 20 20 20% 的数据,保证 n , m ≤ 3000 n,m≤3000 n,m≤3000。
对于 100 100 100% 的数据,保证 1 ≤ n ≤ 40000 1≤n≤40000 1≤n≤40000, 1 ≤ m ≤ 50000 1≤m≤50000 1≤m≤50000, 1 ≤ a i ≤ 1 0 9 1≤ a_i ≤ 10^9 1≤ai≤109 , 1 ≤ l , r ≤ n 1≤ l,r ≤n 1≤l,r≤n。
S o l u t i o n \rm Solution Solution
结合我个人的做法及网上的做法,总结如下。
本题为在线求区间众数。众数不具有区间可加性,使用线段树等数据结构来维护将极其困难。由于数据范围较小,可以采用分块。
为了方便计算时间及空间复杂度,设 t t t 表示将序列 a a a 分为 t t