树状数组(Binary Indexed Tree)

树状数组

树状数组(Binary Indexed Tree,BIT)是一种维护区间信息的数据结构。

对于长度为n的序列,维护n个子区间,在修改和查询时分为子区间维护。

原理蕴含在此图中:

来自《算法竞赛入门经典-训练指南》

每一个区间都可以分成若干个不相交子区间之和,其中x区间长度为lowbit(x)=x&(-x)


操作:

(1)add(x,k),将位置x的数加上k,然后维护各个包含它的区间(不断加上lowbit)。

(2)sum(x),查询a[1]+……+a[x]的和(不断减去lowbit)。


拓展:

树状数组其实并不是只能用来维护区间和。

想想查询区间中,需要一步相减的操作,那么对于存在逆元的操作(区间乘积,异或……)都可以用树状数组解决。


代码:

void init()
{
 memset(a,0,sizeof(a));
 memset(c,0,sizeof(c));
}

int lowbit(int x) 
{
 return x&(-x);
}
void add(int x,int k) //修改
{
 while (x<=n) {c[x]+=k;x+=lowbit(x);}
}

int sum(int x) //求和
{
 int ans=0;
 while (x>0) {ans+=c[x];x-=lowbit(x);}
 return ans;
}
posted @ 2016-05-28 11:17  Krew  阅读(146)  评论(0)    收藏  举报