题意:给一个序列q个询问,每次询问求给定区间内重复出现次数最多的数的重复次数
思路:取一个辅助数组,当a[i]==a[i-1]
时b[i]=b[i-1]+1
,否则b[i]=1
,即b[i]为到i之前重复出现数字的重复次数,每次询问时由于l之前可能有重复,就暴搜直到出现不重复的位置t,t到r就可以用ST表求区间最大值,取这两个值中的最大值即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 100005;
int n, q, a[maxn], b[maxn], st[maxn][30], Log[maxn];
int query(int l, int r)
{
if (l > r) return 0;
int k = Log[r-l+1];
return max(st[l][k], st[r-(1<<k)+1][k]);
}
int main()
{
Log[1] = 0;
for (int i = 2; i < maxn; i++)
Log[i] = Log[i>>1] + 1;
while (~scanf("%d", &n) && n) {
scanf("%d", &q);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
st[1][0] = b[1] = 1;
for (int i = 2; i <= n; i++) {
if (a[i] == a[i-1])
b[i] = b[i-1]+1;
else
b[i] = 1;
st[i][0] = b[i];
}
for (int i = n; i >= 1; i--)
for (int j = 1; i+(1<<j)-1 <= n; j++) {
st[i][j] = max(st[i][j-1], st[i+(1<<j-1)][j-1]);
}
for (int i = 1; i <= q; i++) {
int l, r, t;
scanf("%d%d", &l, &r);
t = l;
while(t<=r&&a[t]==a[t-1])
t++;
int ans = query(t, r);
ans = max(ans, t-l);
printf("%d\n", ans);
}
}
return 0;
}