一、树状数组介绍二、代码
一、树状数组介绍树状数组是一种用数组模拟的树形结构,修改和查询的复杂度都是O(logN),常用于解决区间更新以及求和问题.
上图中:
C[1] = A[1];
C[2] = A[1] + A[2];
C[3] = A[3];
C[4] = A[1] + A[2] + A[3] + A[4];
C[5] = A[5];
C[6] = A[5] + A[6];
C[7] = A[7];
C[8] = A[1] + A[2] + A[3] + A[4] + A[5] + A[6] + A[7] + A[8];
由此可得这颗树的规律:
C[i]=A[i-
2
k
2^k
2k+1]+A[i-
2
k
2^k
2k+2]+…+A[i],其中k为i的二进制中从最低位到高位连续零的长度,
2
k
2^k
2k也叫lowbit,可以利用位运算计算,如下
int lowbit(int x){ return x&(-x); }二、代码
树状数组的单点修改,单点查询和区间查询的完整代码如下:
#include#include #include #include #include #include #include #include #include #include #include #include #include
评论列表(0条)