资料收集
简单说说
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;
}