今天刚刚接触数壮数组,大概的原理是理解了,不过理解的不是很透彻,也就是知其然,不知其所以然.所以把数状数组的基本操作暂时先记录下来.等以后理解透彻之后在进一步的总结整理.
分两中情况讨论:
一.每次修改的是区间上的某个点,所求的是关于某个区间.
第一个函数:
int low_bit (int x){
return x & -x;
}
这个函数主要是界定树状数组(暂且这么以为吧)的范围;
例如:
由函数可知 C1=A1;
C2=C1+A2=A1+A2;
C3=C3=A3;
C4=C2+C3+A4=A1+A2+A3=A4;
C5=A5;
.......................
C8=C4+C6+C7+A8=A1+A2+A3+A4+A5+A6+A7+A8;
第二个函数:
int sum (int i){
int ans = 0;
while (i){
ans += bit[i];
i -= i & -i;
}
return ans;
i
这个函数是求1,2,3.......i 的区间和.
第三个函数:
void add (int i,int val){
while (i<=n){
bit[i] += val;
i += i & -i;
}
}
这个函数主要是更新区间上i点的值加上val;
二.每次修改的是一个区间,所求的值是关于某个点的.
这种情况和上面的那中情况基本上差不多,只要稍加改动即可;
第二个函数:
int sum (int i){
int ans = 0;
while (i<=n){
ans += bit[i];
i += low_bit (i);
}
return ans;
}
第三个函数:
void add (int i,val){
while (i){
bit[i] += val;
i -= low_bit (i);
}
}