比楼下好一点(10 pts)
查看原帖
比楼下好一点(10 pts)
606173
LAICZ楼主2023/7/18 11:28
#include <bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;

template <typename T>
struct BIT{
	int n;
	vector <T> bit;
	void fwk(int _n){
		n = _n;
		bit.resize(n);
	}
	
	void add(int pos,T val){
		int p = pos;
		while(p <= n){
			bit[p] += val;
			p += lowbit(p);
		}
	}
	
	T sum(int pos){
		int p = pos;
		T ret = 0;
		while(p > 0){
			ret += bit[p];
			p -= lowbit(p);
		}
		return ret;
	}
	
	T query(int l,int r){
		return sum(r) - sum(l - 1);
	}
	
};

BIT <int> d1,d,a;

int sum_a(int i){
	return (i + 1) * d.query(1,i) - d1.query(1,i);
}

int query_a(int l,int r){
	return sum_a(r) - sum_a(l - 1);
}

int main(){
	int n,m;
	cin>>n>>m;
	a.fwk(n + 5),d.fwk(n + 5),d1.fwk(n + 5);
	for(int i = 1;i <= n;i++){
		int t;
		cin>>t;
		a.add(i,t);
		d.add(i,t - a.query(i - 1,i - 1));
		d1.add(i,i * d.query(i,i));
	}
	for(int i = 1;i <= m;i++){
		int op,x,y,k;
		cin>>op>>x>>y;
		if(op == 1){
			cin>>k;
			d.add(x,k);
			d.add(y + 1,-k);
			d1.add(x,k * x);
			d1.add(y + 1,-k * x);
		}else{
			cout<<query_a(x,y)<<endl;
		}
	}
}

求调。BIT封装树状数组,里面操作肯定正确,怀疑是我公式推导出了问题

蒟蒻公式推导

2023/7/18 11:28
加载中...