P3765 总统选举

题意

给定一个序列,表示 \(n\) 个人每个人给 \(a_i\) 投了一票。

每次操作给定序列 \([l, r]\),求 \([l, r]\) 的众数。

\([l, r]\) 没有绝对众数则令该区间的众数为 \(p\),并将随后给定的 \(k\) 个整数,\(a_{s_1}, a_{s_2}, ... a_{s_k}\) 改为 \(p\)

Sol

摩尔投票。

一句话总结,就是设二元组 \((x, y)\),表示当前数为 \(x\),权值为 \(y\)

若合并两个二元组 \((x_1, y_1), (x_2, y_2)\)\(y\) 较大的 \(x\)\(y\) 相减,若 \(x\) 相同,则 \(y\) 相加。

这个玩意显然是满足结合律的。

考虑使用线段树维护这个东西。

但是有个问题,摩尔投票保证若 区间有众数 则留下的一定是众数,若区间没有众数,求出来的不一定是众数。

可以考虑用一颗平衡树判断每一次操作的是否是区间的众数。

复杂度:\(O(n \log n)\)

posted @ 2024-05-03 15:34  cxqghzj  阅读(3)  评论(0编辑  收藏  举报