复健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当需要区间修改&&单点查询的时候只需要维护一个差分数组即可

posted @ 2020-11-05 18:06  maniac!  阅读(70)  评论(0)    收藏  举报