P3765 总统选举
题意#
给定一个序列,表示 n 个人每个人给 ai 投了一票。
每次操作给定序列 [l,r],求 [l,r] 的众数。
若 [l,r] 没有绝对众数则令该区间的众数为 p,并将随后给定的 k 个整数,as1,as2,...ask 改为 p。
Sol#
摩尔投票。
一句话总结,就是设二元组 (x,y),表示当前数为 x,权值为 y。
若合并两个二元组 (x1,y1),(x2,y2) 取 y 较大的 x,y 相减,若 x 相同,则 y 相加。
这个玩意显然是满足结合律的。
考虑使用线段树维护这个东西。
但是有个问题,摩尔投票保证若 区间有众数 则留下的一定是众数,若区间没有众数,求出来的不一定是众数。
可以考虑用一颗平衡树判断每一次操作的是否是区间的众数。
复杂度:O(nlogn)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步