绝对众数+摩尔投票

一个区间的绝对众数。一个序列中的众数,如果出现次数大于 \(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;
}

练习题:https://www.luogu.com.cn/problem/CF1514D

posted @ 2024-08-06 14:36  hhhqx  阅读(17)  评论(0编辑  收藏  举报