AcWing 3493 - 最大的和 - 前缀和

Posted Chivas_/Regal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 3493 - 最大的和 - 前缀和相关的知识,希望对你有一定的参考价值。

题目:
在这里插入图片描述

思路:
我们想获取区间内选了之后的sum变化,即选取能让答案增加最多的区间
因此我们就需要两个数值来对比

可以使用两个前缀和
一个是只记录选了1的数的前缀和,一个是记录全选的前缀和
两个前缀和在k的区间内的差值,就是这k个数从只选1到全选之后所能做出的贡献
记录贡献最大值,然后加上第一个前缀和[n]

代码:

const int N = 1e5 + 10;

ll n, k;
ll a[N], b[N], sum1[N], sum2[N];
ll res;

int main(){
    read(n); read(k);
    for(int i = 1; i <= n; i ++) read(a[i]);
    for(int i = 1; i <= n; i ++) read(b[i]), 
    	sum1[i] = sum1[i - 1] + a[i] * b[i], 
    	sum2[i] = sum2[i - 1] + a[i];

    for(int i = k; i <= n; i ++) 
    	res = MAX(res, (sum2[i] - sum2[i - k]) - (sum1[i] - sum1[i - k]));
    res += sum1[n];
    
    write(res);
    return 0;
}

以上是关于AcWing 3493 - 最大的和 - 前缀和的主要内容,如果未能解决你的问题,请参考以下文章

AcWing:135. 最大子序和(前缀和 + 单调队列)

3493. 最大的和

前缀和和差分模板(AcWing 795-798)

AcWing 796. 子矩阵的和

Acwing 135 最大子序和

Acwing算法学习之前缀和