为什么区间加区间改的树状数组不用初始化?
  • 板块学术版
  • 楼主S0CRiA
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/8/18 17:12
  • 上次更新2023/11/4 10:11:28
查看原帖
为什么区间加区间改的树状数组不用初始化?
390770
S0CRiA楼主2021/8/18 17:12

rt

//loj132
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=2e6+10;
struct BIT{
    int bit[2][N], a[N], sum[N], n;
    #define lowbit(x) ((x)&(-(x)))
    inline void build(){
        for(int i = 1; i <= n; ++ i){
        	sum[i] = sum[i-1] + a[i];
			//这里没有初始化,现在的 bit 数组都是 0
        }
    }
    inline void add(int k, int node, int v){
        while(node <= n) bit[k][node] += v, node += lowbit(node);
    }
    inline int prefix(int k, int r){
        int ans = 0;
        while(r) ans += bit[k][r], r -= lowbit(r);
        return ans;
    }
    inline void Add(int l, int r, int x){
    	add(0, l, x), add(0, r + 1, -x);
    	add(1, l, l * x), add(1, r + 1, - (r + 1) * x);
	}
	inline int Query(int l, int r){
		int rr = sum[r] + (r + 1) * prefix(0, r) - prefix(1, r);
		int ll = sum[l-1] + l * prefix(0, l - 1) - prefix(1, l - 1);
		return rr - ll;
	}
} k;

signed main(){
	int m;
	scanf("%lld%lld", &k.n, &m);
	for(int i = 1; i <= k.n; ++ i){
		scanf("%lld", &k.a[i]);
	}
	k.build();
	while(m--){
		char op[2]; int l, r, x;
		scanf("%s%lld%lld", op, &l, &r);
		if(op[0] == '1'){
			scanf("%lld", &x);
			k.Add(l, r, x);
		} else {
			printf("%lld\n", k.Query(l, r));
		}
	}
	return 0;
}
2021/8/18 17:12
加载中...