线段树和树状数组(记录一下模板)

本文深入探讨了线段树和树状数组这两种高效的数据结构,详细讲解了它们在单点修改和区间查询场景下的应用。通过具体的实现代码,展示了如何构建线段树,进行节点更新,查询区间和,以及树状数组的加法操作和前缀和查询,为解决复杂的数据查询和更新问题提供了有力的工具。

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

线段树(单点修改,区间查询)

vector<int> seg;	// 线段树数组
void segUpdate(const int & k) {
	seg[k] = seg[k << 1] + seg[k << 1 | 1];
}
void build(const int & k, const int & l, const int & r, vector<int> & nums) {
	if (l == r) {
		seg[k] = nums[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(k << 1, l, mid, nums);
	build(k << 1 | 1, mid + 1, r, nums);
	segUpdate(k);
}
void change(const int & k, const int & l, const int & r, const int & x, const int & y) {
	if (l == r) {
		seg[k] = y;
		return;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) {
		change(k << 1, l, mid, x, y);
	}
	else {
		change(k << 1 | 1, mid + 1, r, x, y);
	}
	segUpdate(k);
}
int query(const int & k, const int & l, const int & r, const int & x, const int & y) {
	if (x <= l && y >= r) {
		return seg[k];
	}
	int mid = (l + r) >> 1;
	int sum = 0;
	if (x <= mid) {
		sum += query(k << 1, l, mid, x, y);
	}
	if (y > mid) {
		sum += query(k << 1 | 1, mid + 1, r, x, y);
	}
	return sum;
}

树状数组(单点修改区间查询)

int c[10000];    // 树状数组
void add(int i, const int & val) {
	for (; i <= n; i += i & (-i)) {
		c[i] += val;
	}
}
int getsum(int i) {
	int res = 0;
	for (; i > 0; i -= i & (-i)) {
		res += c[i];
	}
	return res;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值