View Code of Problem 2995

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e5+10;
int n,dp[maxn][20],A[maxn],arr[maxn];
void ST(){
	for(int i=1;i<=n;i++){
		dp[i][0]=A[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(l>r)
		return 0;	
	int k=floor(log((double)(r-l+1))/log(2.0));
//	while((1<<k+1)<=r-l+1)
//		k++;
	return max(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main(void){
	ios::sync_with_stdio(false);
	int q;
	while(cin>>n&&n){
		cin>>q;
		for(int i=1;i<=n;i++){//记录出现的次数 
			cin>>arr[i];
			if(i==1){
				A[i]=1;
				continue;
			}
			if(arr[i]==arr[i-1]){
				A[i]=A[i-1]+1;
			}
			else
				A[i]=1;
		}
		ST();
		while(q--){
			int a,b;
			cin>>a>>b;
			int temp=a;
			while(temp<=b&&arr[temp]==arr[temp-1])//当查找的位置正好是连续的中间时找到最大的 
				temp++;
			int cnt=RMQ(temp,b);//运用RMQ查找最大的 
			int ans=max(temp-a,cnt);
			cout<<ans<<endl;
		}
			
	}
}

Double click to view unformatted code.


Back to problem 2995