Running Miles
题意:
给一个数组a,任选一个区间l,r求a[i1]+a[i2]+a[i3]-(r-l)的最大值,其中l<=i1<i2<i3<=r。
思路:
利用前缀和和后缀和,l[i]表示前i个a[i]+i的最大值,r[i]表示后i个a[i]-i的最大值,最后枚举每一个i求l[i]+a[i]+r[i]的最大值即可。
代码:
/*************************************************************************
> File Name: d.cpp
> Author: Beans
> Mail: 3112748286@qq.com
> Created Time: 2023/5/14 21:13:51
************************************************************************/
#include <iostream>
#include <algorithm>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 3e5 + 7;
int t, n;
int a[maxn];
int l[maxn], r[maxn];
void solve(){
cin >> n;
for(int i = 1; i <= n; i ++ )
cin >> a[i];
r[n + 1] = -0x3f3f3f3f;
for(int i = 1; i <= n; i ++ ){
l[i] = max(l[i - 1], i + a[i]);
r[n - i + 1] = max(r[n - i + 1 + 1], a[n - i + 1] - (n - i + 1));
}
int ans = 0;
for(int i = 2; i <= n - 1; i ++ )
ans = max(ans, l[i - 1] + a[i] + r[i + 1]);
cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> t;
while(t -- )
solve();
}