RT,思路是最优区间必然是左端点和右端点为最大值和最小值,不妨设左端点为 al,右端点为 ar 且 al>ar.
所以 ans=al−ar−r+l−1=(al+l)−(ar+r)−1,然后直接做,具体看代码。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4e6 + 10;
#define PII pair<int, int>
#define mkp make_pair
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
return x * f;
}
int n, a[N], maxx, minn = 1e18, ans = -1e18;
int calcmn(int i) {
return (a[i] + i) - minn - 1;
}
int calcmx(int i) {
return maxx - (a[i] - i) - 1;
}
signed main() {
// freopen("range01.in", "r", stdin);
n = read();
for(int i = 1; i <= n; ++i) a[i] = read();
for(int i = n; i >= 1; --i) {
minn = min(minn, a[i] + i); //左端点最大
ans = max(ans, calcmn(i));
}
for(int i = n; i >= 1; --i) {
maxx = max(maxx, a[i] - i); //右端点最大
ans = max(ans, calcmx(i));
}
printf("%lld", ans);
return 0;
}