abc438d

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值