Mobile phones-二维树状数组
update@2011-08-01
///直接套一维的 主要代码如下
int C[(1<<10)+1][(1<<10)+1] = {};
int lowbit(int x){
return x & (x^(x-1));//这一步是把x的二进制表示中的最低位1取出来
//x = ***100
//x-1 = ***011
//x ^ (x-1) = 000111
//x & (x ^ (x-1)) = 000100
//return x&(-x);
//x = ***100
//-x = ---011 + 1 = ---100;
//x&-x = 000100;
}
void add(int i,int j,int v,int upper){//增加
int t_i,t_j;
for(t_i = x;t_i <= upper;t_i += lowbit(t_i)){
for(t_j = y;t_j <= upper;t_j += lowbit(t_j)){
C[t_i][t_j] += v;
}
}
}
int query(int i,int j){//查询
int sum = 0;
int t_i,t_j;
for(t_i = i;t_i > 0;t_i -= lowbit(t_i)){
for(t_j = j;t_j > 0;t_j -= lowbit(t_j)){
sum += C[t_i][t_j];
}
}
return sum;
}
//注意add操作和query操作
add(x+1,y+1,v,n);
printf("%d\n",query(right+1,top+1) + query(left,bottom) - query(right+1,bottom) - query(left,top+1));
题目链接:Mobile phones
简单的二维树状数组,先看一维的,到二维就很简单了。百度百科有个图,看那个图就能明白树状数组是什么样子的 以及为什么C[i] = A[i-2^k + 1]到A[i]的和,还有lowbit函数的意思