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