【题解】洛谷P4168 [Violet]蒲公英 (分块)

博客介绍了如何解决在线求区间众数的问题,通过分块策略处理洛谷P4168[Violet]蒲公英题目。文章详细讲解了两种方法,包括预处理所有段边界为端点的区间众数,并在每次询问时,利用辅助数组和前缀和更新答案。方法一的时间复杂度为O(nn),方法二的时间复杂度为O(nnlogn)。
摘要由CSDN通过智能技术生成

【题解】洛谷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+x1)modn)+1,r=((r0+x1)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,m3000
对于 100 100 100% 的数据,保证 1 ≤ n ≤ 40000 1≤n≤40000 1n40000 1 ≤ m ≤ 50000 1≤m≤50000 1m50000 1 ≤ a i ≤ 1 0 9 1≤ a_i ≤ 10^9 1ai109 1 ≤ l , r ≤ n 1≤ l,r ≤n 1l,rn


S o l u t i o n \rm Solution Solution

结合我个人的做法及网上的做法,总结如下。

本题为在线求区间众数。众数不具有区间可加性,使用线段树等数据结构来维护将极其困难。由于数据范围较小,可以采用分块。
为了方便计算时间及空间复杂度,设 t t t 表示将序列 a a a 分为 t t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值