强制在线区间众数(分块)

该博客讨论了如何处理强制在线的区间众数查询问题,通过对序列离散化和分块策略,实现O(nn)的复杂度求解。在分析部分,博主详细解释了分块的思想,并给出了两种情况下的解决方案:当众数不在不完整块中时,答案为相邻块的众数;当众数在不完整块中时,通过暴力枚举并利用upper_bound和lower_bound优化,以O(nn)的时间复杂度找到区间内出现次数最多的数。
摘要由CSDN通过智能技术生成

题意

给出一个长度为 n n n 的序列,有 m m m 次询问,每次询问给出 [ l , r ] [l,r] [l,r],求区间众数。强制在线。
n , m ≤ 500000 n,m\leq 500000 n,m500000

分析

首先对 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,blr1
  • 众数是不完整块中的数
    首先设答案初值为 f b l l + 1 , b l r − 1 f_{bl_{l}+1,bl_{r}-1} fbll+1,blr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值