分块.莫队
分块
1.在线求区间众数问题
# include <bits/stdc++.h>
using namespace std;
const int MAXN=4e4+100;
int a[MAXN],pos[MAXN],val[MAXN],cnt[MAXN],mn[1000][1000];
int t;
map<int,int> mp;
vector<int> G[MAXN];
int check(int l,int r,int x)
{
return upper_bound(G[x].begin(),G[x].end(),r)-lower_bound(G[x].begin(),G[x].end(),l);
}
int main()
{
int n,m; scanf("%d%d",&n,&m);
t=100;
int tot=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
pos[i]=(i-1)/t+1;
if(!mp[a[i]]) mp[a[i]]=++tot,val[tot]=a[i];
a[i]=mp[a[i]];
G[a[i]].push_back(i);
}
for(int i=1;i<=pos[n];i++){
memset(cnt,0,sizeof(cnt));
int l=(i-1)*t+1;
int maxx=0,id=0;
for(int j=l;j<=n;j++){
cnt[a[j]]++;
if(maxx<cnt[a[j]]||(maxx==cnt[a[j]]&&val[a[j]]<id)) maxx=cnt[a[j]],id=val[a[j]];
mn[i][pos[j]]=id;