#include<bits/stdc++.h>
using namespace std;
long long a[100005],n;
int st_minn[100005][21],st_maxx[100005][21];
int fmax(int c,int d){
if(a[c]>a[d]||(a[c]==a[d]&&c<d)) return c;
return d;
}
int fmin(int c,int d){
if(a[c]<a[d]||(a[c]==a[d]&&c>d)) return c;
return d;
}
void init(){
for(int i=1;i<=n;i++) st_minn[i][0]=st_maxx[i][0]=i;
int t=log2(n);
for(int j=1;j<=t;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
st_minn[i][j]=fmin(st_minn[i][j-1],st_minn[i+(1<<(j-1))][j-1]);
st_maxx[i][j]=fmax(st_maxx[i][j-1],st_maxx[i+(1<<(j-1))][j-1]);
}
}
return;
}
int ans=0;
void fen(int l,int r){
if(l>=r||ans>=r-l+1) return;
int ke=log2(r-l+1);
int he=1<<ke;
int l1=fmin(st_minn[l][ke],st_minn[r-he+1][ke]);
int r1=fmax(st_maxx[l][ke],st_maxx[r-he+1][ke]);
if(l1==r1){
if(ans<r1-l1+1) ans=r1-l1+1;
fen(l,l1-1);
fen(r1+1,r);
return;
}
else{
fen(l,r1);
fen(l1+1,r1-1);
fen(l1,r);
return;
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
init();
fen(1,n);
cout<<ans;
return 0;
}
多少分,哪个点错了?
ber,你的题面去哪里了
1.fen(l1+1,r1-1);
这个应该改成 fen(r1+1,l1-1);
。
2.当 l1==r1
时应该 return
,并且这个:
if(l1==r1){
if(ans<r1-l1+1) ans=r1-l1+1;
fen(l,l1-1);
fen(r1+1,r);
return;
}
改成这个:
if(l1<r1){
if(ans<r1-l1+1) ans=r1-l1+1;
fen(l,l1-1);
fen(r1+1,r);
return;
}
1 个赞