树状数组(BIT)

单点修改 + 区间查询

struct BIT{
	int len;
	int e[N];
	int lowbit(int x) {
		return x & (-x);
	}
	// 单点修改 
	void add(int x, int v) { 
		while (x <= len) {
			e[x] += v;
			x += lowbit(x);
		}
	}
	// 前缀和 
	int ask(int x) { 
		int ans = 0;
		while (x) {
			ans += e[x];
			x -= lowbit(x);
		}
		return ans;
	} 
	BIT(int n, int *a) {
		len = n;
		memset(e, 0, sizeof e); // **
		rep(i, 1, n) {
			cin >> a[i];
			add(i, a[i]);
		}
	}
};

模板题 洛谷【模板】树状数组 1

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define rep(i,a,b) for(int i = a; i <= b; i ++) 
#define lb(x) x&(-x)
const int N = 5e5 + 5;

int a[N];
struct BIT{
	int len;
	int e[N];
	void add(int x, int v) {
		while (x <= len) {
			e[x] += v;
			x += lb(x);
		}
	}
	int ask(int x) {
		int ans = 0;
		while (x) {
			ans += e[x];
			x -= lb(x);
		} 
		return ans;
	}
	BIT(int n, int *a) {
		len = n;
		memset(e, 0, sizeof e);
		rep(i, 1, n) {
			cin >> a[i];
			add(i, a[i]);
		}
	} 
};

int main() {
	IOS; 
	int n, m; cin >> n >> m;
	BIT tre(n, a);
	while (m --) {
		int op, x, y; cin >> op >> x >> y;
		if (op == 1) tre.add(x, y);
		else cout << tre.ask(y) - tre.ask(x - 1) << "\n";
	}
	return 0;
}

区间修改 + 单点查询

struct BIT{
	int len;
	int b[N];
	int lb(x) {
		return x & -x;
	}
	void add(int x, int v) {
		while (x <= len) {
			b[x] += v;
			x += lb(x);
		}
	}
	int que(int x) {
		int ans = 0;
		while (x) {
			ans += b[x];
			x -= lb(x);
		}
		return ans;
	} 
	BIT(int n, int *a) {
		len = n;
		memset(b, 0, sizeof b);
		rep(i, 1, n) {
			cin >> a[i];
			add(i, a[i] - a[i - 1]);
		}
	}
};

模板题 洛谷树状数组2

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define rep(i,a,b) for(int i = a; i <= b; i ++) 
#define lb(x) x&(-x)
const int N = 5e5 + 10;

int a[N];
struct BIT{
	int len;
	int b[N];
	void add(int x, int v) {
		while (x <= len) {
			b[x] += v;
			x += lb(x);
		}
	}
	int que(int x) {
		int ans = 0;
		while (x) {
			ans += b[x];
			x -= lb(x);
		}
		return ans;
	}
	BIT(int n, int *a) {
		len = n;
		memset(b, 0, sizeof b);
		rep(i, 1, n) {
			cin >> a[i];
			add(i, a[i] - a[i - 1]);
		}
	}
};

int main() {
	IOS;
	int n, m; cin >> n >> m;
	BIT tre(n, a);
	while (m --) {
		int op; cin >> op;
		if (op == 1) {
			int l, r, v; cin >> l >> r >> v;
			tre.add(l, v), tre.add(r + 1, -v);
		} else {
			int x; cin >> x;
			cout << tre.que(x) << "\n";
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值