看完视频讲解后还是不太明白,后来看了一个博客,终于是懂了,其实树状数组就是巧妙的运用到了二分,不得不佩服,发明的人真是脑洞大开;
这是我看的博客实在是好:http://blog.csdn.net/int64ago/article/details/7429868
对了(差点忘了),添加几道题目:
1.hdu 1166 http://acm.hdu.edu.cn/showproblem.php?pid=1166
2.(士兵杀敌系列) http://115.159.40.116/contest_show.php?cid=93#info
我也简单的讲一下,可能不太好
其中a数组是题目给的一串数,而c数组是存的二分型的前i项和,什么意思呢,看一下第二张图,看了第二张图可能更明白一点,先不需要弄懂如何来写,先弄懂他的过程。
第二张图是c数组存的数,你可以看出他的存储方式是从c[i]=c[i/2]+另一半,而另一半也是按(c[i]=c[i/2]+另一半)的方式来存的,这其中巧妙地运用到了二分,具体的可以看上面的那个链接;
下面介绍一下如何,存c数组;
void update(int k,int num,int n)//k是你输入的第几个数,num是那个数,
{
while(k<=n)
{
c[k]+=num;
k+=k&-k;//二分的加法
}
}
下面是求前k项的和;
int read(int k)//1-k的区间和
{
int sum=0;
while(k)
{
sum+=c[k];
k-=k&-k;
}
return sum;
}