给定长度为 n 的非降序列,q 次询问给定 l,r,求区间 [l,r] 内出现次数最多的数的出现次数。
1≤n,q≤105
−105≤ai≤105
WA,莫队。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n, q, T, a[100010], c[100010], ans[100010], cnt, maxc[100010];
struct Range {
int l, r, id;
bool operator <(const Range &W)const {
if (l / T != W.l / T) return l < W.l;
return r < W.r;
}
}b[100010];
void add(int x) {
maxc[c[x]] -- ;
c[x] ++ ;
maxc[c[x]] ++ ;
cnt = max(cnt, c[x]);
}
void del(int x) {
if (cnt == c[x] && maxc[c[x]] == 1) cnt -- ;
maxc[c[x]] -- ;
c[x] -- ;
maxc[c[x]] ++ ;
}
int main() {
scanf("%d%d", &n, &q);
T = sqrt(n);
for (int i = 1; i <= n; i ++ ) {
scanf("%d", &a[i]);
a[i] += 100010;
}
for (int i = 1; i <= q; i ++ ) {
scanf("%d%d", &b[i].l, &b[i].r);
b[i].id = i;
}
sort(b + 1, b + q + 1);
int L = 1, R = 0;
for (int i = 1; i <= q; i ++ ) {
while (L > b[i].l) add(a[ -- L]);
while (R < b[i].r) add(a[ ++ R]);
while (L < b[i].l) del(a[L ++ ]);
while (R > b[i].r) del(a[R -- ]);
ans[b[i].id] = cnt;
}
for (int i = 1; i <= q; i ++ ) printf("%d\n", ans[i]);
return 0;
}