C++ – 前缀和

前缀和是用来快速实现区间加减的方法(O(N^2)–>O(N)),可分为单维和多维。其实现形式是通过数据离线将下面是两个单维前缀和的代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1000016];
int b[1000016];
int main() {
    int n,m;
    scanf(%d %d,&n,&m);
    memset(b,0,sizeof b);
    for(int i=1; i<=n; i++)
        scanf(%d,&a[i]);
    for(int i=1; i<=m; i++){
        int q,l,r,p;
        scanf(%d,&q);
        if(q==1) {
            scanf(%d %d %d,&l,&r,&p);
            b[r+1]+=p;
            b[l]-=p;
        } else {
            scanf(%d %d %d,&l,&r,&p);
            b[r+1]-=p;
            b[l]+=p;
        }
    }
    int l,r;
    scanf(%d %d,&l,&r);
    for(int i=1;i<=n;i++)
        b[i]+=b[i-1];
    long long ans = 0;
    for(int i=l;i<=r;i++)
    ans+=a[i]+b[i];
    printf(%lld,ans);
    return 0;
}

发表回复