版权声明:版权归Ordinarv所有 https://blog.csdn.net/ordinarv/article/details/82466826
题目大意
给出一串数字,求指定区间L-R中出现次数最多的数的次数。
分析
用a数组表示相同的个数。
所以,求出与l相同的个数,和从第一个不和l相同的数到r 直接求
AC Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
const int INF=0x3f3f3f3f;
int dp[maxn][20],a[maxn],ori[maxn];
void ST(int n) {
for (int i = 1; i <= n; i++)
dp[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++) {//2^j
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}
}
}
int RMQ(int l, int r) {
if(l>r) return 0;
int k = 0;
while ((1 << (k + 1)) <= r - l + 1) k++;
return max(dp[l][k], dp[r - (1 << k) + 1][k]);
}
int main() {
int n,q,l,r;
while(~scanf("%d",&n)&&n) {
scanf("%d",&q);
//memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++) {
scanf("%d",&ori[i]);
if(ori[i]==ori[i-1])
a[i]=a[i-1]+1;
else
a[i]=1;
}
ST(n);
while(q--) {
scanf("%d%d",&l,&r);
int t=l;
while(ori[t]==ori[l]&&t<=r){
t++;
}
printf("%d\n",max(RMQ(t,r),t-l));
}
}
return 0;
}