树状数组

21 篇文章 0 订阅
12 篇文章 0 订阅

看完视频讲解后还是不太明白,后来看了一个博客,终于是懂了,其实树状数组就是巧妙的运用到了二分,不得不佩服,发明的人真是脑洞大开;

这是我看的博客实在是好: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;  
}  


总结:这种算法真是让人脑洞大开,不得不服,以后要多学习


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值