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

树状数组(未完成)

时间:2018-11-11 01:05:32      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:color   ati   树状   元素   class   http   技术   void   解释   

 技术分享图片

 

(建议边对着图边看解释)

 

 背景:若在线地修改数列里某个数的值,其维护【前缀和】的复杂度太高

 

树状数组c性质:

1、c[i]的管辖区间以a[i]结尾,从某种意义来说,c[i]与a[i]一一对应

2、c[i]的管辖区间长2^k,k是i的二进制末尾0的个数

3、父亲的管辖区间是儿子区间长度的二倍

4、c[i]的值是a的和,c[i]=a[i-2^k+1]+……+a[i]

 

主要操作解释:

 

1、修改某个元素并一路往上更新

 

修改a[i],从第一个元素c[i]开始(c[i]一定以a[i]结尾),每次下标i加上其管辖区间长度2^k即得到父亲的下标,也就是父亲管辖区间的最后一个元素下标

 

 1     //返回2^k
 2     static int lowbit(int i){
 3         return i&(-i);
 4     }
 5     
 6     static void update(int i,int x){
 7         while (i<=n){
 8             c[i]+=x;
 9             i+=lowbit(i);
10         }
11     }

 

2、求a中前i项的和

 

累加i前的所有最大子树的根的值,(每次减小i的2^k的值即可从一颗最大子树的根直接跳到另一颗最大子树的根)

 

1     static int query(int i){
2         int sum=0;
3         while (i>0){
4             sum+=c[i];
5             i-=lowbit(i);
6         }
7         return sum;
8     }

 

树状数组(未完成)

标签:color   ati   树状   元素   class   http   技术   void   解释   

原文地址:https://www.cnblogs.com/towerbird/p/9941030.html

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