树状数组专题 太过爱你忘了你带给我的痛 2022-07-16 13:16 87阅读 0赞 树状数组构造出的基础结构: ![这里写图片描述][883867-20160810150435699-1238857602.png] 树状数组的基础是一个被构造出来的式子: C\[i\]=A\[i\]+A\[i-1\]+….+A\[i-2^k+1\] k代表i的二进制的最后连续0的个数 如图:设节点编号为x,那么这个节点管辖的区间为2^k个元素。 C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 + A4 C5 = A5 C6 = A5 + A6 C7 = A7 C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 … C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16 -------------------- (1),lowbit 计算2^k有一个快捷的办法: int lowbit(int x){ return x&(x^(x–1)); return x&(-x);//也可以写成这样 } (2),修改(Change) i小于等于n的时候: c\[i\] = c\[i\] + x; // x为变化值,如3变成10,只需要修改10-3=7; i = i + lowbit(i) 若需改变a\[i\],则c\[i\]、c\[i+lowbit(i)\]、c\[i+lowbit(i)+lowbit(i+lowbit(i)\]……也会发生改变 所以修改原数组中的第n个元素可以实现为: void Change(int pos , int num) //pos~n的数据修改num { while(pos <= n) { in[pos] += num; pos += Lowbit(pos); } } (3),求和(Sum) i大于0: sum = sum +c\[n\]; //从n开始往下回溯 n = n - lowbit(n); // 每次查询下面节点 若需查询s\[i\],则c\[i\]、c\[i-lowbit(i)\]、c\[i-lowbit(i)-lowbit(i- lowbit(i))\]……就是需要累加的c数组中的元素。 所以求和原数组中的第n个元素可以实现为: int Sum(int n) { int sum = 0; while(n > 0) //倒序相加 { sum += in[n]; end -= Lowbit(n); } return sum; } (1),快速查询任意位置的和,sun(i), (2),快速查询 i~j 区间的和,sum(j)-sum(i-1): ![这里写图片描述][20161118215055790] (3),如果是2维:查询(x1,y1),( x2,y2 )区间的和: ![这里写图片描述][20161118215848715] (四)应用 (1),区间更新,单点求值 (2),单点更新,区间求职 (3),逆序数 -------------------- 1,HDU 1166(敌兵布阵) 2,NYOJ 116(士兵杀敌) [http://blog.csdn.net/acm\_hmj/article/details/53224105][http_blog.csdn.net_acm_hmj_article_details_53224105] 3,HDU 1892(See you~~) [883867-20160810150435699-1238857602.png]: /images/20220715/1b4ceba7bd6c48f796603e2823d43be6.png [20161118215055790]: /images/20220715/57f2d7eebb8745b8a18b1681b75f45c7.png [20161118215848715]: /images/20220715/f9dde6b7810c438cb3a03fa53027a27e.png [http_blog.csdn.net_acm_hmj_article_details_53224105]: http://blog.csdn.net/acm_hmj/article/details/53224105
相关 树状数组 详细介绍:[https://www.cnblogs.com/xenny/p/9739600.html][https_www.cnblogs.com_xenny_p_973960 我不是女神ヾ/ 2023年08月17日 16:26/ 0 赞/ 122 阅读
相关 树状数组 目录: 1. 概念 2. 应用 3. 充分性 4. 建立树状数组 5. 典题分析 一.概念 数组来模拟树形结构。那么、为什么不直接建树?没必要,因为树 秒速五厘米/ 2023年02月25日 11:29/ 0 赞/ 25 阅读
相关 树状数组 1、概述 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组\{a 朱雀/ 2022年08月10日 10:53/ 0 赞/ 256 阅读
相关 树状数组 树状数组 树状数组:用线性数据结构的方法解决动态统计子树权和的问题。 类似于线段树,将区间分成小段,方便计算权和。 举个栗子,将a数组构造成树状数组c。 如果a 忘是亡心i/ 2022年07月26日 08:44/ 0 赞/ 245 阅读
相关 树状数组专题 树状数组构造出的基础结构: ![这里写图片描述][883867-20160810150435699-1238857602.png] 树状数组的基础是一个被构造出来的式子: 太过爱你忘了你带给我的痛/ 2022年07月16日 13:16/ 0 赞/ 88 阅读
相关 树状数组初探 前言 在前一篇文章:[线段树初探][Link 1] 中我们看了一下线段树的基本思想并且知道了线段树擅长于解决区间问题。其实对于某些区间问题,我们不仅可以用线段树解决,还可 古城微笑少年丶/ 2022年05月30日 03:22/ 0 赞/ 196 阅读
相关 树状数组 树状数组单点修改,单点查询 洛谷oj :[点我][Link 1] 模板: include<iostream> include<cstdio> 心已赠人/ 2022年05月16日 05:17/ 0 赞/ 288 阅读
相关 树状数组实现 树状数组能够完成如下操作: 给一个序列a0-an 计算前i项和 对某个值加x 时间o(logn) 注意:有人觉得前缀和就行了,但是你还要维护啊,改变某个值,一个一个改 叁歲伎倆/ 2022年05月12日 02:44/ 0 赞/ 184 阅读
相关 树状数组板子 树状数组 重点是在树状的数组 大家都知道二叉树吧 叶子结点代表A数组A\[1\]~A\[8\] ![786945-20161206222443741-120171603 r囧r小猫/ 2022年03月15日 15:22/ 0 赞/ 296 阅读
相关 树状数组模板 //树状数组 struct Bit { vector<int> a; int sz; void ini ゞ 浴缸里的玫瑰/ 2021年09月19日 05:46/ 0 赞/ 364 阅读
还没有评论,来说两句吧...