这一块在寒假前就已经理解了,开学后再看的时候感觉有点生疏了,感觉还是在这总结一下比较好。
一维树状数组: 首先理解一个函数int lowbit( int x),这个函数是求从下标x-(x&(-x))+1开始计数,连续相加到下标x处,总共有x&(-x)个数相加。一维树状数组就是要求给你一个数组序列,以各个元素为叶子节点,从下往上构造一棵二叉树。假如某一个左孩子结点的编号为i,该父亲节点的编号为x+lowbit(x),若为右孩子结点,该父亲节点为x-lowbit(x)。
相关函数:
- void add(int x,int b,int& n) { //Ax加上b,各个连续子序列的和的变化
- while(x<=n) {
- c[x]+=b;
- x+=lowbit(x);
- }
- }
- int getsum(int x) { //求出前x个数相加的和
- int sum=0;
- while(x>0) {
- sum+=c[x];
- x-=lowbit(x);
- }
- return sum;
- }
二维树状数组:一维的理解了之后,只需要构造出一个C[x][y] = sum(A[i][j]),其中,x-lowbit[x]+1 <= i<=x且y-lowbit[y]+1 <= j <=y。应用:
一个由数字构成的大矩阵,能进行两种操作
1) 对矩阵里的某个数加上一个整数(可正可负)
2) 查询某个子矩阵里所有数字的和