P4062 Yazid的新生舞会(树状数组)
Yazid的新生舞会
题目描述
Yazid 有一个长度为 的序列 ,下标从 至 。显然地,这个序列共有 个子区间。
对于任意一个子区间 ,如果该子区间内的众数在该子区间的出现次数严格大于 (即该子区间长度的一半),那么 Yazid 就说这个子区间是“新生舞会的”。
所谓众数,即为该子区间内出现次数最多的数。特别地,如果出现次数最多的数有多个,我们规定值最小的数为众数。
现在,Yazid 想知道,共有多少个子区间是“新生舞会的”。
思路:
如果一个数是当前区间的众数,那一定会满足移相后可转化为这样子就将原问题转化成了对每个有多少个满足,可以直接用树状数组来维护,但是直接做的时间复杂度是,所以需要进一步去优化.
令,可以发现在上一次出现所选众数的位置和下一次出现的位置之间,是一个公差为的等差数列,那么每出现一次就相当于给后面的区间加上一个公差为的等差数列.那么用来存储权值,用来表示的前缀和,每一个,它对区间的贡献就是.那么对区间的贡献就是,记来表示的前缀和,所以总共的贡献就是。这样就转化为了一个区间加和二维前缀和的操作。
就将二维前缀和转化成了差分数组的三维前缀和,因为这个式子太过于繁琐要推导出一个能够用树状数组直接计算的式子.
对于展开为再合并一下同类项,,前的系数是一个等差数列,可以求和再次化简, ,最终转化为
对于展开为,合并为
只需要用树状数组分别维护就行了。
__EOF__

本文作者:HoneyGrey
本文链接:https://www.cnblogs.com/Haven-/p/16737340.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Haven-/p/16737340.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现