前缀和是用来快速实现区间加减的方法(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;
}

发表回复