BIT---学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BIT---学习笔记相关的知识,希望对你有一定的参考价值。
第一个数据结构(不要错啊。。)
后面一部分<=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后刚好是要操作的地方;
就这样吧。
[email protected],有疑问或写的有问题(可能很高啊)可以发下。
以上是关于BIT---学习笔记的主要内容,如果未能解决你的问题,请参考以下文章