voj题目链接:https://cn.vjudge.net/problem/HihoCoder-1710
思路:与 UVA - 11235 类型相同,之前写过,思路也一样
之前写的 UVa 11235:https://blog.csdn.net/weixin_41380961/article/details/88670210
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,m,ans;
int A[100010];
int L[100010],R[100010],sum[100010],dp[100010][25];
void init_RMQ()
{
for(int i=1; i<=n; i++)dp[i][0]=sum[i];
for(int j=1; (1<<j)<=n; 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(r<l)
return -1;
int k=0;
while(1<<(k+1)<=r-l+1) k++;
return max(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
scanf("%d",&A[i]);
int i=1,j,ca,cut,q;
while(i<=n)
{
q=i;
ca=A[i+1]-A[i];
j=i;
cut=1;
while(j<=n&&A[j+1]-A[j]==ca) j++,cut++;
for(; i<j; i++)
{
L[i]=q,R[i]=j,sum[i]=cut;
}
}
init_RMQ();
int l,r;
while(m--)
{
scanf("%d%d",&l,&r);
ans=min(R[l]-l+1,r-l+1);
ans=max(ans,min(r-L[r]+1,r-l+1));
ans=max(ans,RMQ(R[l]+1,L[r]-1));
printf("%d\n",ans);
}
}
}