树状数组实现 叁歲伎倆 2022-05-12 02:44 161阅读 0赞 树状数组能够完成如下操作: 给一个序列a0-an 计算前i项和 对某个值加x 时间o(logn) 注意:有人觉得前缀和就行了,但是你还要维护啊,改变某个值,一个一个改变前缀和就是o(n)了。 线段树树状数组的题就是这样,维护一个树,比较容易看出来。 线段树: [https://blog.csdn.net/hebtu666/article/details/82691008][https_blog.csdn.net_hebtu666_article_details_82691008] 如果使用线段树,只需要对网址中的实现稍微修改即可。以前维护最小值,现在维护和而已。 注意:要求只是求出前i项,而并未给定一个区间,那我们就能想出更快速、方便的方法。 对于任意一个节点,作为右孩子,如果求和时被用到,那它的左兄弟一定也会被用到,那我们就没必要再用右孩子,因为用他们的父就可以了。 这样一来,我们就可以把所有有孩子全部去掉 把剩下的节点编号。 ![960a304e251f95ca5e588459cf177f3e660952ab.jpg][] 如图,可以发现一些规律:1,3,5,7,9等奇数,区间长度都为1 6,10,14等长度为2 ........................ 如果我们吧编号换成二进制,就能发现,二进制以1结尾的数字区间长度为1,最后有一个零的区间为2,两个零的区间为4. 我们利用二进制就能很容易地把编号和区间对应起来。 计算前i项和。 需要把当前编号i的数值加进来,把i最右边的1减掉,直到i变为0. 二进制最后一个1可以通过i&-i得到。 更新: 不断把当前位置i加x,把i的二进制最低非零位对应的幂加到i上。 下面是代码: 思想想出来挺麻烦,代码实现很简单,我都不知道要注释点啥 向发明这些东西的大佬们致敬 int bit[MAX_N+1] int n; int sum(int i) { int gg=0; while(i>0) { gg+=bit[i]; i-=i&-i; } return gg; } void add(int i,int x) { while(i<=n) { bit[i]+=x; i+=i&-i; } } [https_blog.csdn.net_hebtu666_article_details_82691008]: https://blog.csdn.net/hebtu666/article/details/82691008 [960a304e251f95ca5e588459cf177f3e660952ab.jpg]: https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=08d4c8271c4c510fbac9ea4801304e48/960a304e251f95ca5e588459cf177f3e660952ab.jpg
相关 树状数组 详细介绍:[https://www.cnblogs.com/xenny/p/9739600.html][https_www.cnblogs.com_xenny_p_973960 我不是女神ヾ/ 2023年08月17日 16:26/ 0 赞/ 104 阅读
相关 树状数组 1、概述 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组\{a 朱雀/ 2022年08月10日 10:53/ 0 赞/ 235 阅读
相关 树状数组详解 在一个数组中。若你需要频繁的计算一段区间内的和,你会怎么做?,最最简单的方法就是每次进行计算,但是这需要O(N)的时间复杂度,如这个需求非常的频繁,那么这个操作就会占用大量的C 阳光穿透心脏的1/2处/ 2022年08月05日 14:26/ 0 赞/ 170 阅读
相关 树状数组 树状数组 树状数组:用线性数据结构的方法解决动态统计子树权和的问题。 类似于线段树,将区间分成小段,方便计算权和。 举个栗子,将a数组构造成树状数组c。 如果a 忘是亡心i/ 2022年07月26日 08:44/ 0 赞/ 228 阅读
相关 详解--树状数组 写下这个标题,其实心里还是没底的,与其说是写博帖,不如说是做总结。第一个接触树状数组还是两年前,用什么语言来形容当时的感觉呢?……太神奇了!真的,无法表达出那种感觉 淡淡的烟草味﹌/ 2022年06月10日 03:24/ 0 赞/ 207 阅读
相关 树状数组初探 前言 在前一篇文章:[线段树初探][Link 1] 中我们看了一下线段树的基本思想并且知道了线段树擅长于解决区间问题。其实对于某些区间问题,我们不仅可以用线段树解决,还可 古城微笑少年丶/ 2022年05月30日 03:22/ 0 赞/ 176 阅读
相关 树状数组 树状数组单点修改,单点查询 洛谷oj :[点我][Link 1] 模板: include<iostream> include<cstdio> 心已赠人/ 2022年05月16日 05:17/ 0 赞/ 265 阅读
相关 树状数组实现 树状数组能够完成如下操作: 给一个序列a0-an 计算前i项和 对某个值加x 时间o(logn) 注意:有人觉得前缀和就行了,但是你还要维护啊,改变某个值,一个一个改 叁歲伎倆/ 2022年05月12日 02:44/ 0 赞/ 162 阅读
相关 树状数组板子 树状数组 重点是在树状的数组 大家都知道二叉树吧 叶子结点代表A数组A\[1\]~A\[8\] ![786945-20161206222443741-120171603 r囧r小猫/ 2022年03月15日 15:22/ 0 赞/ 277 阅读
相关 树状数组模板 //树状数组 struct Bit { vector<int> a; int sz; void ini ゞ 浴缸里的玫瑰/ 2021年09月19日 05:46/ 0 赞/ 351 阅读
还没有评论,来说两句吧...