摩尔投票法学习笔记
摩尔投票法
绝对众数 :数列内出现次数超过数列长度一半的数。
摩尔投票法是一个求绝对众数的利器。
例题
1. 洛谷 P2397 yyy loves Maths VI (mode)
摩尔投票法板子题。
假设现在有一个小房子,有一个新的数 需要进来。
- 如果房子是空的,那么 就直接进去;
- 如果房子内的数和 相等,那么 也进去;
- 否则把房子内的其中一个数带出房子。
其实本质是将众数与其他数配对,然后抵消掉。因为众数出现次数大于一半,所以最后留在房子里的数一定是众数。
2. P3765 总统选举
用线段树维护区间内出现次数超过一半的数 以及它的出现次数与其他数的出现次数之和的差 。
显然可以合并。合并时分类讨论两个儿子的 是否相等:
- 若相等,则当前结点的 就是儿子的 , 就等于两个儿子的 的和;
- 若不相等,则当前结点的 是 更大的儿子的 , 为两个儿子的 之差的绝对值。
然而此题还要讨论众数出现次数不超过区间长度一半的情况。若不考虑空间,可以对每一个数开一个动态开点线段树记录它在哪些位置出现过。这样查找一个数的出现次数只用询问区间和。然而这样做的空间复杂度是 ,无法承受。因此只能开 棵平衡树,每次 或 相应的位置,然后查询出现次数就找到对应的平衡树, 的 与 的 相减即可。
3. P8496 [NOI2022] 众数
每个数列开一棵动态开点线段树,按前一题的方法 。插入、删除就用链表维护,注意存每个链表的头元素和尾元素。查询时将对应数列的 一下即可。对于操作 ,合并一下两个链表和两棵线段树即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现