码迷,mamicode.com
首页 > 其他好文 > 详细

BIT---学习笔记

时间:2017-09-08 14:49:03      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:实现   树状   数组   ret   com   数据压缩   owb   最大的   border   

第一个数据结构(不要错啊。。)


后面一部分<=2^x;第一部分最后一个值为前2^x个数的和(包括最后一个数它本身);后一部分如果没全就不用,全了同上;与线段树不同,树状数组数据压缩更紧;压缩方式是以2^x(x为2^x不超过数组长度的最大的x) 把[1…n]分割,就成了两部分,

(此时只是先讲它长啥样,不用管实现或其他细节(其实也没其他细节))

然后每部分同理对2^(x-1)分,分到最小 

- - - - - - - - - - - - - - - 16
- - - - - - -  8                 
- - -  4          - - - 12        
 -  2      -  6      - 10     - 14    
 1      3     5     7     9    11   13   15  


如图(如果没有第16位,把上面一行拿掉就可以了(可能长的不是很美观))

因为他把区间和与原本的数据和在一起,空间小了,但灵活度也小了(比如求4的数据是要相减),线段树就是把数据和区间和分开,所有多了很多操作。

代码:(先感受一下)

int BIT[maxn],N;
int lowbit(int x){return x&(-x);}//(14)10->(1110)2,lowbit是2  x&-x涉及二进制的奇妙领域,还没研究过
void add(int x,int num)          //(24)10->(11000)2,lowbit是8
{
     while(x<=N){
       BIT[x]+=num;
       x+=lowbit(x);
     }
}
int profix_sum(int x)//前缀和
{
    int sum=0;
    while(x){
      sum+=BIT[x];
      x-=lowbit(x);
    }
    return sum;
}

p_sum比较好理解,就是从最下面一层不断向前向上加

add是向上向后修改(因为前面的与它无关,只会影响后面的),把所有覆盖到这个数的都处理一遍;、

但第一次看,总体还是很神奇的,尤其是加减lowbit后刚好是要操作的地方;

就这样吧。

 

3027104720@qq.com,有疑问或写的有问题(可能很高啊)可以发下。

 

 

 

 

 

BIT---学习笔记

标签:实现   树状   数组   ret   com   数据压缩   owb   最大的   border   

原文地址:http://www.cnblogs.com/Gsimt/p/7494142.html

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