30分求助
查看原帖
30分求助
320470
William_Takazaki楼主2023/8/14 16:06
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,L=20;
int n,m,f1[N][L],f2[N][L],a[N],lg[N],b1[N],len1,b2[N],len2;
int main(){
	int i,j,k,x=1,y;
	cin>>n;
	y=n;
	for(i=1;i<=n;i++)cin>>a[i];
	for(i=2;i<=n;i++)lg[i]=lg[i/2]+1;
	for(j=0;j<L;j++){
		for(i=1;i+(1<<j)-1<=n;i++){
			if(j==0){
				f1[i][j]=a[i];
				f2[i][j]=a[i];
			}else{
				f1[i][j]=max(f1[i][j-1],f1[i+(1<<j-1)][j-1]);
				f2[i][j]=min(f2[i][j-1],f2[i+(1<<j-1)][j-1]);
			}
		}
	}k=lg[y-x+1];
	int p1=min(f2[k][x],f2[y-(1<<k)+1][k]),p2=max(f1[k][x],f1[y-(1<<k)+1][k]);
	for(i=1;i<=n;i++){
		if(a[i]==p1){
			len1++;
			b1[len1]=i;
		}
	}for(i=1;i<=n;i++){
		if(a[i]==p2){
			len2++;
			b2[len2]=i;
		}
	}
	/*
	for(i=1;i<=len1;i++)cout<<b1[i]<<" ";
	cout<<endl;
	for(i=1;i<=len2;i++)cout<<b2[i]<<" ";
	cout<<endl;
	*/
	int maxx=0;
	for(i=1;i<=len1;i++){
		for(j=1;j<=len2;j++){
			if(b2[j]>b1[i]){
				maxx=max(maxx,b2[j]-b1[i]+1);
			}
		}
	}cout<<maxx;
	return 0;
}
2023/8/14 16:06
加载中...