区间众数,利用线段树,维护区间众数转换的平度序列。
线段树记录区间最大值,即为连续区间众数连续个数。
平度序列例如:
1 1 1 1 2 3 3 3
1 2 3 4 1 1 2 3
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int M=1e6+100;
long long tr[M],ls[M],rs[M],m[M];//m记录区间最大值,ls,rs记录区间从左数多少个相同,rs右数,tr记录原数列
void pushup(int i,int l,int r)
{
int mid=l+r>>1;
ls[i]=ls[i*2];
rs[i]=rs[i*2+1];
if(ls[i]==mid-l+1)
{
if(tr[mid]==tr[mid+1])
ls[i]+=ls[i*2+1];
}
if(rs[i]==r-mid)
{
if(tr[mid]==tr[mid+1])
rs[i]+=rs[i*2];
}
m[i]=max(m[i*2],m[i*2+1]);
if(tr[mid]==tr[mid+1])
m[i]=max(m[i],ls[i*2+1