码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组

时间:2020-01-26 19:03:58      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:turn   区间   深度   color   序列   nlogn   个数   维护   get   

基本用途:维护序列的前缀和。

对于给定的序列a,建立一个数组c,其中c[x]保存序列a的区间[x-lowbit(x)+1,x]中所有数的和,其中lowbit(x)指:x的二进制下最小的2的次幂,如:       lowbit(7)=1,lowbit(6)=2,lowbit(5)=1,lowbit(4)=4

技术图片

 该结构满足一下性质:

  1. 每个内部节点c[x]保存以它为根的子树中所有叶节点的和
  2. 每个内部节点c[x]的子节点个数等于lowbit(x)的位数
  3. 除树根外,每个内部节点c[x]的父节点是c[x+lowbit(x)]
  4. 树的深度为o(logN)

 

初始化 建立一个全为0的数组c,对位置x初始化为a[x],执行add(x,a[x])  

时间复杂度O(NlogN)

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

 

单点增加  对位置x增加a[x],执行add(x,a[x])

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

 

查询前缀和(1~x)时间复杂度O(logN)

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

若查询序列a的区间[l,r]中所有数的和,只需计算ask(r)-ask(l-1)

 

模板题:https://www.luogu.com.cn/problem/P3374

 

 

树状数组

标签:turn   区间   深度   color   序列   nlogn   个数   维护   get   

原文地址:https://www.cnblogs.com/gcw0618/p/12234534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!