ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

摩尔投票法学习笔记

2022-09-04 15:01:59  阅读:164  来源: 互联网

标签:cnt 线段 摩尔 笔记 次数 num 投票 众数 mathrm


摩尔投票法

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

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

例题

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

摩尔投票法板子题。

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

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

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

2. P3765 总统选举

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

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

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

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

3. P8496 [NOI2022] 众数

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

标签:cnt,线段,摩尔,笔记,次数,num,投票,众数,mathrm
来源: https://www.cnblogs.com/zltzlt-blog/p/16655114.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有