模板一:单点修改,区间求和
#define lowbit(x) x&(-x)
const int maxn=100010;
int n,bit[2*maxn];
int query(int x){
int s=0;
while(x>0){
s+=bit[x];
x-=lowbit(x);
}
return s;
}
void change(int x,int v){
while(x<=n){
bit[x]+=v;
x+=lowbit(x);
}
}
模板二:区间修改,单点查询
将原数组存储成差分数组,根据差分的性质,在区间[l,r]上同时加上x可以处理成:
(change(l,x))
(change(r+1,-x))
查询下标为i的元素值可以处理成:
(query(i))
模板三:区间修改,区间求和
设置两个BIT,bit0和bit1
(sum_{j=1}^{i}a_j=query(bit1,i) imes i+query(bit0,i))
在区间[l,r]上同时加上x可以处理成:
(change(bit0,l,-x*(l-1)))
(change(bit1,l,x))
(change(bit0,r+1,x*r))
(change(bit1,r+1,-x))
区间[l,r]的求和可以处理成:
(query(bit1,r)*r+query(bit0,r)-(query(bit1,l-1)*(l-1)+query(bit0,l-1)))