树状数组

BIT功能:区间查询,单点更新;区间更新,单点查询;求逆序对。


lowbit(a)=a&(-a)//二进制中 最后一个1;

更新 i 点的值: 不断加上二进制中最末尾的1的数;

例如:5(0101) 需要加上(0001)—> 6 (0110) 再加上 (0010) —>8(1000).....

void add(int pos,int num)  //  修改操作    pos为数组下标位置,num为要增加的值   
{  
    while(pos<=n)   //n为数组的长度    
    {  
        c[pos]+=num;  
        pos+=lowBit(pos);  
    }  
} 


求前缀和如下:不断减去二进制中最末尾的1的数;

例如:5(0101) 需要减去(0001)—> 4 ( 0100 ) 再减去 ( 0100 ) —>0(0000).....
int sum(int pos)  //求A[1]+...+A[pos]   
{  
    int sum=0;   
    while(pos>0)  
    {  
        sum+=c[pos];  
        pos-=lowBit(pos);  
    }  
      
    return sum;   
}        

区间更新

void add(int i,int num)
{
	while(i>0)//与当点更新的区别之一
	{
		c[i]+=num;
		i-=lowbit(i);//+号改为-号
	}
}

单点查询

int sum(int i)
{
	int out=0;
	while(i<=n)//大于号改为小于等于
	{
		out+=c[i];
		i+=lowbit(i);//改为正号
	}
	return out;
}



posted @ 2014-05-05 21:27  kewowlo  阅读(104)  评论(0编辑  收藏  举报