rt,核心思路就是区间的两个端点一定是最大值和最小值,然后把左端点是最小值,右端点最大值的扫一遍,然后把右端点是最小值,左端点最大值的扫一遍。WA on 7、10
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
char c; int x=0,f=1; c=getchar();
while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); }
while(c>='0'&&c<='9'){ x=(x<<3)+(x<<1)+(c^48); c=getchar(); }
return x*f;
}
int a[4000001],n;
signed main()
{
n=read();
for(register int i=1;i<=n;i++){
a[i]=read();
}
int min1=a[1],max1=a[1],l=1,r=1,ans1=-1e18;
ans1=max(ans1,max1-min1-(r-l+1));
for(register int i=2;i<=n;i++){
if(a[i]<=min1){
min1=max1=a[i];
r=l=i;
}
if(a[i]>max1){
max1=a[i];
r=i;
}
ans1=max(ans1,max1-min1-(r-l+1));
}
int max2=a[1],min2=a[1],ans2=-1e18;
l=1; r=1;
ans2=max(ans2,max2-min2-(r-l+1));
for(register int i=2;i<=n;i++){
if(a[i]>=max2){
max2=min2=a[i];
r=l=i;
}
if(a[i]<min2){
min2=a[i];
r=i;
}
ans2=max(ans2,max2-min2-(r-l+1));
}
printf("%lld\n",max(ans1,ans2));
return 0;
}
```cpp