poj 1195 树状数组

本文介绍了一种使用树状数组实现的二维数据结构,通过该结构可以高效地完成区间更新和查询操作。文章提供了完整的代码示例,展示了如何对指定范围内的一组数据进行更新和求和运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



二维树状数组,每一行用一个树状数组表示
在求和和更新的时候,要对指定的行操作。
执行指令2 时,对l~r行逐个求和相加。
注意:把所有的坐标加一,树状数组更新数据时位置不能为零

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1030
#define lowbit(x) (x&-x)
using namespace std;
int c[N][N],n;

void add(int r,int k, int sum) {
	while (k <= N) {
		c[r][k] += sum;
		k += lowbit(k);
	}
}
int sum(int r,int k) {
	int res = 0;
	while (k) {
		res += c[r][k];
		k -= lowbit(k);
	}
	return res;
}
int main() {
	int com;
	while (EOF!=scanf("%d", &com)) {
		if (com == 0) {
			scanf("%d", &n);
		}
		else if (com == 1) {
			int x, y, a;
			scanf("%d%d%d", &x, &y, &a);
			x++; y++;
			add(x, y, a);
		}
		else if (com == 2) {
			int l, b, r, t;
			scanf("%d%d%d%d", &l, &b, &r, &t);
			l++; b++; r++; t++;
			int ans = 0;
			for (int i = l; i <= r; i++)
				ans += sum(i, t) - sum(i, b - 1);
			printf("%d\n", ans);
		}
		else if (com == 3)break;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值