树状数组(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;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号