蒲公英

这里主要是讲一下如何预处理以及时间复杂度的计算

首先来看方法一

预处理时,最外层循环是i,第二层循环是j,表示第i个块到第j个块

先讲一下区间众数如何维护,记sum[i]表示i这个数出现的次数

假设此时已经维护好了[i,j]这些块的众数(记为most),而且也维护好了sum数组,当j+1时,我们依次循环这个块里面的每个数,设当前循环到k这个数字,那么令sum[k]++,并且将sum[k]sum[most]比较,如果前者更大,令most=k,最后的most就是要求的众数

时间复杂度为O(NT(1+T)T2)=O(NT),注意每一次j+1后就有O(NT)个数不用再扫描了

那么还要维护每个数出现的次数,就要在j+1的时候复制一下cnt数组,时间复杂度为O(N),算上外面两层循环,时间复杂度是O(NT2)

再来看方法二

由于不用维护每个数出现的次数了,预处理的时间复杂度就退化为了O(NT)

我们再想办法把log优化掉

我们不用二分,而是用s[i][j]表示前i个块中j出现的次数

预处理也是类似的,复杂度为O(NT)

然后每次查询暴力区间中x出现的个数时,就可以变成O(1)

一道很类似的题:作诗

可以看出,需要统计区间元素的个数的可以往分块上面靠

posted @   最爱丁珰  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示