复健1--树状数组
当初学竞赛的时候觉得树状数组不好理解所以用线段树水过了orz,所以复健先从这里开始(((
首先需要明白lowbit:
lowbit(x)是x的二进制表达式中最低位的1所对应的值。
比如,6的二进制是110,所以lowbit(6)=2。
其中lowbit有两种不同的写法
int lowbit (int x) {
return x & -x;
}
以及
int lowbit(int x)
{
return x & ( x ^ ( x - 1 ) );
}
由于所有正整数都可以用二进制表示,利用lowbit可以找出x中包含的最小二进制数,我们利用每个二进制数节点来存子段前缀和

核心代码:
void add(int x,int y){
for(; x <= n;x += x & -x)a[x] += y;
}
int ask(int x){
int ans=0;
for(; x; x -= x & -x) ans+=a[x];
return ans;
}
洛谷3374 树状数组1最基本的单点修改&&区间查询
洛谷3368 树状数组2当需要区间修改&&单点查询的时候只需要维护一个差分数组即可

浙公网安备 33010602011771号