树状数组—介绍

       树状数组是一种形如大树的数据结构。树状数组和线段树很像,但能用树状数组解决的问题,基本上都能用线段树解决,而线段树能解决的树状数组不一定能解决。相比较而言,树状数组超快代码简洁内存超少,几乎没缺点。



以发现:

   C[1] =a[1] ------------------------------C[1B]1

   C[2] =a[1]+a[2]--------------------------C[10B]2

   C[3] =a[3]-------------------------------C[11B]1

   C[4] =a[1]+a[2]+a[3]+a[4]----------------C[100B]4

   C[5] =a[5]-------------------------------C[101B]1

   C[6] =a[5]+a[6]--------------------------C[110B]2

  C[7] =a[7]-------------------------------C[111B]1

  C[8] =a[1]+a[2]+…+a[8]------------------C[1000B]8

  ..............................

  C[16]=a[1]+a[2]+…+a[16] ---------------C[10000B]16

这里有一个有趣的性质:如果C[x]x转为二进制,后面有连续k0那么C[x]2^k

而且分别是 a[x]+a[x-1]+a[x-2]+ … +a[x–2^k+1]。

    想要得到c[x]的管理区域非常简单,只需要 x&-x 即可,这是利用了计算机是以补码的形式存储数字的特性,使之一步到位,简单便捷。


知道了c[x]的管理范围和它的编号后,我们就可以求出:

     1、离c[x]最近并且管理c[x]的管理者,它是x+lowbit(x)

     2、在c[x]之前并且恰好不管理c[x]的管理者,它是x-lowbit(x)


推荐:《树状数组—改点求段》http://blog.csdn.net/a_bright_ch/article/details/54598319
      《树状数组—改段求段》http://blog.csdn.net/a_bright_ch/article/details/54616312
      《树状数组—改段求点》http://blog.csdn.net/a_bright_ch/article/details/54616490

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值