绝对众数+摩尔投票
一个区间的绝对众数。一个序列中的众数,如果出现次数大于 \(N \div 2\) 在是绝对众数。
摩尔投票:定义两个变量 \(x,c\)
- 从左到右遍历加入,如果加入的 \(a_i\) 不等于当前变量 \(x\),则 \(c\) 减一,否则 \(c\) 加一。
- 若加入时 \(c=0\),则 \(x = a_i\) 且 \(c = 1\)
最后的如果 \(x\) 不是绝对众数,则 \(A\) 没有绝对众数,否则 \(x\) 为绝对众数。
可以发现摩尔投票只用存储一个二元组,本质是一种二元祖合并(或运算),显然支持合并,所以可以与线段树结合。
模板题:https://www.luogu.com.cn/problem/P2397
模板题代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using PII = pair<int, int>;
const int MAXN = 2e6 + 3;
int n;
PII Merge(PII i, PII j){
if(i.first == j.first){
return {i.first, i.second + j.second};
}
if(i.second > j.second) return {i.first, i.second - j.second};
return {j.first, j.second - i.second};
}
int main(){
cin >> n;
PII ans = {0, 0};
for(int i = 1; i <= n; i++){
PII w;
cin >> w.first, w.second++;
ans = Merge(ans, w);
}
cout << ans.first;
return 0;
}