首页 > 编程语言 > 详细

关于树状数组

时间:2019-03-09 17:35:55      阅读:174      评论:0      收藏:0      [点我收藏+]

技术分享图片

lowbit是什么?

  • lowbit(i)=i&-i
  • 对应于末尾的1所在位置的一个数
  • 节点高度/对应区间长度

i的父节点为lowbit(i)+i

  • 可以观察到它的兄弟节点即是它的父节点
  • 最少加上lowbit(i)lowbit才会增加,即lowbit(i)+i为离i最近的上一层节点

点修改

区间和

1 void add(int no,int num){
2     for(int i=no;i<=n;i+=i&-i)
3         c[i]+=num;
4 }

区间最值

  1. 更新所有父节点
  2. 在每个节点中,采用倍增的思想:
max[12]=max(a[12],c[12-1],c[12-2])
  c[12] a[12] c[12-1] c[12-2]
lowbit 4 1(元素本身) 1 2

 

 

 

 

 

 

1 void update(int no,int num){   
2     c[no]=a[no]=num;
3     for(int i=1;i<(no&-no);i<<=1)
4         c[no]=max(c[no],c[no-i]);
5 }

区间询问

区间和(前缀和)

倍增:sum[5]=c[4]+c[5];

1 int ask(int no){
2     int out=0;
3     for(int i=no;i;i-=i&-i)
4         out+=c[i];
5     return out;
6 }

区间最值

3=(11)2

11=(1011)2

max(3,11)=max(a[11],c[10],a[8],c[7],c[5],a[4],c[3])
  a[11] c[10] a[8] c[7] c[5] a[4] c[3]
lowbit 1 2 / 1 2 / 1
之后 1010 1000 111 110 100 11  
之前 1011 1010 1000 111 110 100 11

 

 

 

 

 

 

 

 1 int ask(int l,int r){
 2     int ans=0;
 3     while(r>=l)
 4     {
 5         ans=max(ans,a[r]);
 6         r--;
 7         for(;r-(r&-r)>=l;r-=r&-r)
 8             ans=max(ans,h[r]);
 9     }
10     return ans;
11 }

关于树状数组

原文:https://www.cnblogs.com/intmian/p/BIT.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!