【算法笔记】Binary Indexed Tree

资料收集

topcoder上的教程
上面教程的中译版
WiKi

简单说说

BIT尽管叫做树,但还是很难形象的把它和树联系起来。而且在初学的时候很难理解lowbit的是怎么来的,为什么要这么维护。。
其实我还是觉得能发明BIT这个东西,确实很奇妙。。。
BIT的主要用途就是维护前缀和,中心思想是用n个节点,每个节点各自负责 2r 长的一段连续和。对于一个节点i,r是i最低位的1的位置。
r(1) = 0, r(2) =1, r(4) = 2….
然后仔细研究教程上面的图,你会发现 i - r(i) 就是维护左边相邻的一段连续和的节点标号,i + r(i) 则是覆盖此节点的下个节点标号。BIT把连续的和都分成一半一半的,所以单点修改和查询前缀和都是O(logMaxV)的。
怎么快速求lowbit呢?
比如12->1100
1)求补码,即-12->0100
2)12 & -12 = 100 = r(12)
所以 x&-x 就好了。
//======================//
在比赛中见别人用末尾1的个数来计算区间长度的…
这时候0就是第一个节点

int sum (int r)
{
    int result = 0;
    for (; r >= 0; r = (r & (r+1)) - 1)
        result += t[r];
    return result;
}

void inc (int i, int delta)
{
    for (; i <= cnt; i = (i | (i+1)))
        t[i] += delta;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值