前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『ACM-算法-数据结构』信息竞赛进阶指南--树状数组 (模板)

『ACM-算法-数据结构』信息竞赛进阶指南--树状数组 (模板)

作者头像
风骨散人Chiam
发布2020-10-28 10:49:39
6730
发布2020-10-28 10:49:39
举报
文章被收录于专栏:CSDN旧文

写在前面: 我们是主要是讲算法模板,即实现的代码,并不讲实现的原理

什么是树状数组?

树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询)。

图呢就是这个形状的:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
// [1,x]分成的O(log(x))个小区间
while (x > 0) {
	printf("[%d, %d]\n", x - (x & -x) + 1, x);
	x -= x & -x;
}

// 树状数组查询前缀和
int ask(int x) {
	int ans = 0;
	for (; x; x -= x & -x) ans += c[x];
	return ans;
}

// 树状数组单点增加
void add(int x, int y) {
	for (; x <= N; x += x & -x) c[x] += y;
}

// 树状数组求逆序对
for (int i = n; i; i--) {
	ans += ask(a[i]);
	add(a[i], 1);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档