假设一维数组为A[i]( i=1 ,2,…n ),则与它对应的树状数组C[i](i=1 ,2,…n)是这样定义的:

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

……

一个有趣的性质
第C(x)管辖的区域为:2^k(k为二进制末尾的0的个数)
比如:
C(8) 8的二进制为1000 所以 k=3 2^3=8

int lowbit (int x)//计算C(x)展开的项数
{return x&-x;
}

X即为数组的下标
意义:计算2^k的值,即C(x)管辖的区域
第二个函数:

int add (int x,int b)
{while(x<=MAXN){Tree(x)+=b;x+=lowbit(x);}
}

解释:

1:b是增量在树的结构中,每次增加b,即为修改了多少,是一个变量。修改了A(x)的值,会一直追溯到最终的父节点。

比如:A(2)增加了b,则该循环使其父节点依次增加b个单位。
C(2) C(4) C(8) 依次增加了b个单位。
2:x是数组的下标。

第三个函数:

int sum (int x)
{int ret=0;while(x>0){ret+=tree[x];x-=lowbit(x);}return ret;
}

解释:

1:求出范围a-b的和

Sum(b)-sum(a)即为所求。

求数列A[]的前n项和,只需找到n以前的所有最大子树,把其根节点的C加起来即可。

如:Sum(1)=C[1]=A[1];

  Sum(2)=C[2]=A[1]+A[2];Sum(3)=C[3]+C[2]=A[1]+A[2]+A[3];Sum(4)=C[4]=A[1]+A[2]+A[3]+A[4];Sum(5)=C[5]+C[4];Sum(6)=C[6]+C[4];Sum(7)=C[7]+C[6]+C[4];Sum(8)=C[8];


一:区间修改,单点查询

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1556
**

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include <cstdlib>
#include <cstdio>
#include <map>
#define lson l,m,i<<1
#define rson m+1,r,i<<1|1
#define lowbit(x) (x&(-x))
using namespace std;const int  MAXN = 100000;
const int  LEN = MAXN + 100;
int tree[LEN];
int N;
void Add(int x,int p)//
{while(x<=N){tree[x] += p;x += lowbit(x);}
}
int Query(int x)
{int sum = 0;while(x){sum += tree[x];x -= lowbit(x);}return sum;
}
int main()
{while(cin>>N&&N){memset(tree,0,sizeof(tree));for(int i = 1; i <= N; i++){int a,b;scanf("%d %d",&a,&b);Add(a,1);Add(b+1,-1);}for(int i = 1; i <= N; i++){if(i>1)printf(" ");printf("%d",Query(i));}cout<<endl;}return 0;
}

**

二 :单点修改,区间查询

**

int low_bit(int x)
{return x&(-x);
}
void add(int i,int c)
{while(i<=n)   //n是一共有多少点{a[i]+=c;i+=low_bit(i);}
}
int q(int i)
{int ans=0;while(i>0){ans+=a[i];i-=low_bit(i);}   return ans;
}
int main()
{add(i,c);   //  i是对那个点增加   c 是要增加的多少   //若查询  l--r  区间的和ans=q(r)-q(l-1);
}

**

三 :区间修改,区间查询

**
略……………

部分转载自:https://blog.csdn.net/qq_24653023/article/details/46991325

树状数组(区间,单点间操作)相关推荐

  1. 树状数组(单点修改,区间修改等)

    前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...

  2. 树状数组区间修改和区间求和

    最一般树状数组能做到的操作是单点修改,区间求和,都是log(n)级别的.原理就是用树状数组维护a[i]的部分和. 想要做到修改区间,求单点值也很简单,用树状数组维护a[i]的差分数组d[i]的部分和既 ...

  3. UESTC 1601 艾尔大停电2 二维树状数组+区间更新

    艾尔大停电2 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  S ...

  4. 树状数组(单点+区间的所有操作)

    转载:https://blog.csdn.net/I_believe_CWJ/article/details/80374326 更简洁方便的数据结构--树状数组(基于线段树的实现) 1.单点更新+区间 ...

  5. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  6. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  7. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  8. Color the ball(树状数组区间更新+单点求值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Color the ball Time Limit: 9000/3000 MS (Java/Ot ...

  9. 树状数组 区间update/query

    Re [问题引入] 对于区间修改.区间查询这样的简单问题,打一大堆线段树确实是不划算,今天来介绍一下区间查询+区间修改的树状数组 [一些基础] 树状数组的基本知识不再介绍,请自行百度 我们假设sigm ...

  10. 校门外的树——树状数组+区间修改

    校门外的树 [题目分析]题目描述的是一种区间修改,看起来好像要用线段树.但是对于这种区间内部没有差别并且查询的是区间内的类别的问题,是可以转化为树状数组进行的.毕竟树状数组更加简单. 我们的关注点应该 ...

最新文章

  1. 思科面试题c语言,C语言面试题~总汇(基础题、嵌入式、微软、华为、思科……).doc...
  2. hexo github pages 搭建博客
  3. 【struts2】struts2配置文件—struts.properties
  4. 用计算机怎么录资料,如何在短时间内快速录入大量数据 -电脑资料
  5. 数据库MySQL/mariadb知识点——日志记录(2)二进制日志
  6. Httpclient远程调用WebService示例
  7. 080520 雨 大风
  8. opencv图像分析与处理(14)- 图像压缩基础知识
  9. OpenCV-Python教程(7、Laplacian算子)
  10. 活性(Liveness)
  11. u盘win7纯净版_如何制作纯净版WIN7启动U盘
  12. 机器人路径规划_人工蜂群算法
  13. 腾讯浏览服务X5内核集成
  14. 理解类8583报文协议
  15. Windows 10做了这9项优化 电脑跑得比谁都快
  16. pandas 取excel 中的某一列_干货Python Pandas 做数据分析之玩转 Excel 报表分析
  17. 网络库libevent、libev、libuv、libhv对比
  18. File的了解与使用
  19. 每天坚持慢跑30分钟,一个月身体会有什么变化?
  20. 用户账户限制,可能的原因包括不允许空密码,登录时间限制,或强制的策略限制...

热门文章

  1. vuex实现及简略解析
  2. Nginx的静态文件合并请求,加快网站的加载速度
  3. Tomcat+MySql+jdbc
  4. 简单理解javascript中的原型对象,实现对之间共享属性和行为
  5. 使用@Transactional(SUPPORTS)和不加@Transactional 有什么区别?
  6. C++中const与指针、引用的分析(转自china_unix GP-King)
  7. mybatis逆向工程详解
  8. Java实现mysql的读写分离
  9. sicp 3.9题解答
  10. tomcat 7配置ssl教程