news 2026/4/2 23:44:48

关于树状数组(略)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于树状数组(略)

查询和修改

long long ask(int x) {//查询a[1]+a[2]+...a[x]的值 long long ret = 0; for (int i = x; i; i -= lowbit(i)) ret += C[i]; return ret; } void add(int x, int d) {//将 x 增加 d for (int i = x; i <= n; i += lowbit(i)) C[i] += d; }

查询是减法,因为分解;修改是加法,因为包含这个数的所有数(范围内)都要随之改变。

注意:

  • lowbit(i)=i & (-i)(保留二进制最低位的1
  • 管辖范围=[i - lowbit(i) + 1, i]
  • 区间长度=lowbit(i)

该结构满足以下性质:

  1. 每个内部节点 c[x] 保存以它为根的子树中所有叶节点的和。
  2. 每个节点x管辖的区间长度 =lowbit(x),范围是[ i−lowbit(i)+1,i ] 。
  3. 除树根外,每个内部节点 c[x] 的父节点是 c[x + lowbit(x)] 。
  4. 树的深度为 O(logN) 。

1.对某个元素进行加法操作
树状数组支持单点增加,意思是给序列中的某个数A[x]加上y,同时正确维护序列的前缀和。根据上面给出的树形结构和它的性质,只有节点x及其所有祖先节点保存的区间和包含A[x],而任意一个节点的祖先至多只有logN个,我们逐一它们的值进行更新即可。下面的代码在O(logN)时间内执行单点增加操作。

void update(int x, int y) { for (; x <= N; x += x & -x) c[x] += y; }

另一种写法

void update(int x, int y) { while(x<=n){ c[x]+=y; x=x+(x&-x); } }

2.查询前缀和
树状数组支持查询前缀和,即序列A第1至x个数的和。按照我们刚才提出的方法,应该求出x的二进制表示中每个等于1的位,把[1,x]分成O(logN)个小区间,而每个小区间的区间和都已经保存在数组c中。下面的代码在O(logN)时间内查询前缀和。

int sum(int x) { int ans = 0; for (; x; x -= x & -x) ans += c[x]; return ans; }

另一种写法

int sum(int x) { int ans = 0; while(x>0){ ans+=c[x]; x=x-(x&-x); } return ans; }

若求sum(7) = c[7] + c[6] + c[4]

3.统计A[x]...A[y]的值
调用以上的sum操作:sum(y) - sum(x - 1)

4.注意事项
要注意树状数组能处理的是下标为1..n的数组,绝对不能出现下标为0的情况,因为lowbit(0) = 0,这样会陷入死循环。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 17:12:37

C++中的适配器模式实战

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/4/2 10:11:17

Linux 命令:diff

概述 diff 命令是文本文件的详细差异对比工具&#xff0c;核心作用是逐行分析两个文件的内容差异&#xff0c;精准识别出新增行、删除行、修改行&#xff0c;并以标准化格式输出差异位置和具体内容。 资料合集&#xff1a;https://pan.quark.cn/s/6fe3007c3e95、https://pan.…

作者头像 李华
网站建设 2026/3/30 13:45:13

33岁转行AI大模型,刚好赶上风口!非常详细收藏我这一篇就够了

引言 “30岁&#xff0c;人生过半&#xff0c;转行还来得及吗&#xff1f;”这是很多人在职业瓶颈期的自我怀疑。但我想告诉你&#xff0c;30岁转行AI大模型&#xff0c;不仅来得及&#xff0c;还刚好赶上了风口&#xff01; 我是如何从一个传统行业的从业者&#xff0c;成功转…

作者头像 李华
网站建设 2026/3/31 3:34:02

Java助力:旅游手册搭子系统源码全解析

Java旅行攻略与搭子系统源码深度解析一、系统架构设计&#xff1a;高可用与实时交互的基石后端框架选型Spring Boot 2.7/3.0&#xff1a;作为核心框架&#xff0c;提供自动配置、起步依赖等功能&#xff0c;快速构建微服务架构&#xff08;用户服务、攻略服务、匹配服务、消息服…

作者头像 李华