题目
思路
用莫队维护
l
—
r
l—r
l—r区间众数,
x
x
x个非众数可以抵消
x
+
1
x+1
x+1个众数
最后的
a
n
s
ans
ans就是没有抵消掉的众数个数
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
int a[500010],cnt[500010],ans[500010],res;
int vis[500010];
struct sut{
int l,r,k;
}d[500010];
int apart,ma;
bool cmp(sut a,sut b){
return (a.l/apart==b.l/apart)?a.r<b.r:a.l<b.l;
}
void add(int x){
vis[cnt[a[x]]]--;
cnt[a[x]]++;
vis[cnt[a[x]]]++;
ma=max(ma,cnt[a[x]]);
}
void sub(int x){
vis[cnt[a[x]]]--;
if(!vis[cnt[a[x]]]&&ma==cnt[a[x]]) ma--;
cnt[a[x]]--;
vis[cnt[a[x]]]++;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
apart=sqrt(n);
for(int i=1;i<=m;i++){
cin>>d[i].l>>d[i].r;
d[i].k=i;
}
sort(d+1,d+1+m,cmp);
int cl=1,cr=0;
for(int i=1;i<=m;i++){
int l=d[i].l,r=d[i].r;
while(cl<l){
sub(cl++);
}
while(cl>l){
add(--cl);
}
while(cr<r){
add(++cr);
}
while(cr>r){
sub(cr--);
}
int res=1;
int len=d[i].r-d[i].l+1;
int ll=len-ma;
ll=ma-ll;
if(ll>1){
res=ll;
}
ans[d[i].k]=res;
//ma=0;
}
for(int i=1;i<=m;i++){
cout<<ans[i]<<endl;
}
return 0;
}