树状数组
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;
}

浙公网安备 33010602011771号