摩尔投票法学习笔记

摩尔投票法

绝对众数 :数列内出现次数超过数列长度一半的数。

摩尔投票法是一个求绝对众数的利器。

例题

1. 洛谷 P2397 yyy loves Maths VI (mode)

摩尔投票法板子题。

假设现在有一个小房子,有一个新的数 x 需要进来。

  • 如果房子是空的,那么 x 就直接进去;
  • 如果房子内的数和 x 相等,那么 x 也进去;
  • 否则把房子内的其中一个数带出房子。

其实本质是将众数与其他数配对,然后抵消掉。因为众数出现次数大于一半,所以最后留在房子里的数一定是众数。

2. P3765 总统选举

用线段树维护区间内出现次数超过一半的数 num 以及它的出现次数与其他数的出现次数之和的差 cnt

显然可以合并。合并时分类讨论两个儿子的 num 是否相等:

  • 若相等,则当前结点的 num 就是儿子的 numcnt 就等于两个儿子的 cnt 的和;
  • 若不相等,则当前结点的 numcnt 更大的儿子的 numcnt 为两个儿子的 cnt 之差的绝对值。

然而此题还要讨论众数出现次数不超过区间长度一半的情况。若不考虑空间,可以对每一个数开一个动态开点线段树记录它在哪些位置出现过。这样查找一个数的出现次数只用询问区间和。然而这样做的空间复杂度是 O(nlogki),无法承受。因此只能开 n 棵平衡树,每次 inserterase 相应的位置,然后查询出现次数就找到对应的平衡树,rrankl1rank 相减即可。

3. P8496 [NOI2022] 众数

每个数列开一棵动态开点线段树,按前一题的方法 merge。插入、删除就用链表维护,注意存每个链表的头元素和尾元素。查询时将对应数列的 root merge 一下即可。对于操作 4,合并一下两个链表和两棵线段树即可。

posted @   zltzlt  阅读(150)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示