悬赏一枚关注
查看原帖
悬赏一枚关注
565945
Azure__楼主2022/7/25 15:50

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
2022/7/25 15:50
加载中...