d题我用了N遍前/后缀和。
先画个图:首先,1 ~ x做前缀和,x+1 ~ n也做前缀和。

那最后的y+1~n呢?我们这样做:
for(int i = n;i>=1;i--){
d[i] = d[i + 1] + c[i];
}
for(int i = 1;i<=n;i++){
e[i] = g[i] + d[i + 1];
}
for(int i = n - 2;i>=1;i--){
e[i] = max(e[i + 1], e[i]);
}
如图,我先做了一遍后缀和,再定义e[i]=g[i]+d[i + 1],其中g[i]是b的前缀和数组,d[i]是对c的前缀和数组。
那么最后我们就可以用O(n)的时间复杂度枚举x,y就直接被e数组处理掉啦!
code:
#include <bits/stdc++.h>
using namespace std;
long long n, a[300005], b[300005], c[300005], d[300005], e[300005], f[300005], g[300005], da = 0;
int main(){
scanf("%lld", &n);
for(int i = 1;i<=n;i++){
scanf("%lld", &a[i]);
f[i] = f[i - 1] + a[i];
}
for(int i = 1;i<=n;i++){
scanf("%lld", &b[i]);
g[i] = g[i - 1] + b[i];
}
for(int i = 1;i<=n;i++){
scanf("%lld", &c[i]);
}
for(int i = n;i>=1;i--){
d[i] = d[i + 1] + c[i];
}
for(int i = 1;i<=n;i++){
e[i] = g[i] + d[i + 1];
}
for(int i = n - 2;i>=1;i--){
e[i] = max(e[i + 1], e[i]);
}
for(int i = 1;i<=n - 2;i++){
da = max(da, f[i] + e[i + 1] - g[i]);
}
printf("%lld", da);
return 0;
}
7964

被折叠的 条评论
为什么被折叠?



