浅谈树状数组 今天药忘吃喽~ 2021-11-01 06:56 334阅读 0赞 今天,我来跟大家谈谈对树状数组的心得。树状数组是一个利用数组来模拟树的一种数据类型,它在特定的题目中可以用来代替树来提高效率。 不同于二叉树,树状数组的大致意思是这样的:(图片来自于王陸) ![1742044-20190716195601841-1245041989.png][] 子结点的1,2,3,4,5,6,7,8对应的是原数组的结构,而上面延伸出来的结点则代表着一段区间的区间和。 ![1742044-20190716200208948-492259688.png][] 这时就要引入到一个函数lowbit,lowbit究竟是用来干什么的的呢? int lowbit(int x) { return x&(-x); } 这个函数可以帮助我们计算到下一步应该去到哪,其具体原理要看每个数字的二进制表示。先观察每一个结点的2进制树表示: 1=0001,2=0010,3=0011,4=0100,5=0101,6=0110,7=0111,8=1000。发现每要往上一个区间走时,1都会向左移一位。以1为例-1在计算机中表示为1111,1&(-1)+1=0010。利用lowbit可以快速帮我们计算出需要加减的值。这样,我们就可以在数组内模拟树的形式。 树状数组到底是用来干什么的呢?树状数组支持的是单点修改以及区间的和的查询。单点修改看起来好说,那么查询要怎么做呢?由于树状数组内i保存的是从1号位到i号位的和,显然区间\[x,y\]内的和应该是bit\[y\]-bit\[x-1\]。那么这样,查询i号为存储的值,就类似于单点修改的反向操作,是一次次向下走。 理解了lowbit,sum以及update之后,树状数组也就呼之欲出了:(在源代码中,我并没有写lowbit而是直接使用了i&(-i)) #include<cstdio> using namespace std; #define kb 500010 inline int read() { int ans=0, w=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') w=-1; ch=getchar(); } while(ch>='0' && ch<='9') { ans=ans*10+ch-'0'; ch=getchar(); } return ans*w; } int bit[kb]; void update(int x, int k, int n) { for(int i=x; i<=n; i+=i&(-i)) bit[i]+=k; } int query(int x) { int ans=0; for(int i=x; i; i-=i&(-i)) ans+=bit[i]; return ans; } int main() { int n=read();int m=read(); for(int i=1; i<=n; i++) { int ai=read(); update(i, ai, n); } for(int i=1; i<=m; i++) { int k=read();int x=read();int y=read(); if(k==1) update(x, y, n); else printf("%d\n", query(y)-query(x-1)); } return 0; } 希望该博客能帮助到大家,如果有什么不懂的可以在评论区留言。 转载于:https://www.cnblogs.com/king-kb/p/11197232.html [1742044-20190716195601841-1245041989.png]: /images/20211101/78f7d95f49dc41d9b70036dd605cf1e2.png [1742044-20190716200208948-492259688.png]: /images/20211101/9a45c69da2b44814a8c7bf7bb105ecaf.png
相关 树状数组 详细介绍:[https://www.cnblogs.com/xenny/p/9739600.html][https_www.cnblogs.com_xenny_p_973960 我不是女神ヾ/ 2023年08月17日 16:26/ 0 赞/ 100 阅读
相关 树状数组 1、概述 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组\{a 朱雀/ 2022年08月10日 10:53/ 0 赞/ 234 阅读
相关 树状数组 树状数组 树状数组:用线性数据结构的方法解决动态统计子树权和的问题。 类似于线段树,将区间分成小段,方便计算权和。 举个栗子,将a数组构造成树状数组c。 如果a 忘是亡心i/ 2022年07月26日 08:44/ 0 赞/ 223 阅读
相关 浅谈Java数组 Java中的数组是静态的,一旦初始化后,长度就不会改变。所谓初始化,就是为数组对象的元素分配内存空间,为每个数组元素指定初始化值。 初始化有两种方式: 1、静态 太过爱你忘了你带给我的痛/ 2022年06月13日 23:47/ 0 赞/ 205 阅读
相关 树状数组模板 1. int lowbit(int t) 2. `{` 3. `return t&(-t);` 4. `}` 1. `void add(int x,int y)` 水深无声/ 2022年05月31日 10:42/ 0 赞/ 231 阅读
相关 树状数组 树状数组单点修改,单点查询 洛谷oj :[点我][Link 1] 模板: include<iostream> include<cstdio> 心已赠人/ 2022年05月16日 05:17/ 0 赞/ 262 阅读
相关 逆序对——浅谈一维树状数组 & 离散化 计算逆序对问题 BZOJ 1266 -------------------- 目录 前言 正文 普通做法 归并排序 树状数组 数组离散化 STL+ 小灰灰/ 2022年04月11日 02:43/ 0 赞/ 226 阅读
相关 树状数组板子 树状数组 重点是在树状的数组 大家都知道二叉树吧 叶子结点代表A数组A\[1\]~A\[8\] ![786945-20161206222443741-120171603 r囧r小猫/ 2022年03月15日 15:22/ 0 赞/ 273 阅读
相关 浅谈树状数组 今天,我来跟大家谈谈对树状数组的心得。树状数组是一个利用数组来模拟树的一种数据类型,它在特定的题目中可以用来代替树来提高效率。 不同于二叉树,树状数组的大致意思是这样 今天药忘吃喽~/ 2021年11月01日 06:56/ 0 赞/ 335 阅读
相关 树状数组模板 \define lowbit(x) (x&(-x)) int c\[Max\], n;//n为元素个数 void add(int x, int v)//单点给元素+ 朱雀/ 2021年07月16日 14:44/ 0 赞/ 406 阅读
还没有评论,来说两句吧...