挂成 80pts 求 Hack
查看原帖
挂成 80pts 求 Hack
482642
hank0402楼主2022/7/24 18:53

RT,思路是最优区间必然是左端点和右端点为最大值和最小值,不妨设左端点为 ala_l,右端点为 ara_ral>ara_l>a_r.

所以 ans=alarr+l1=(al+l)(ar+r)1ans=a_l-a_r-r+l-1=(a_l+l)-(a_r+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;
}
2022/7/24 18:53
加载中...