树状数组(二叉索引树BIT)
- 针对动态连续和查询问题。
对于数组{A1,A2,A3,…An},有操作如下:
Add(x, d):让Ax增加d;Query(L, R):计算A中第L个数到第R个数的和(S[R] - S[L - 1])。 - lowbit(x):x的二进制表达式中最右边1所对应的值。
-x:x按位取反,末尾加1。(补码表示)
→ lowbit(x) = x & -x ; -
黑色结点:BIT中的结点;
以黑色结点结尾的长条:A中的一段连续和。C[i] = A[i - lowbit(i) + 1] + A[i - lowbit(i) + 2] + … + A[i]
前缀和S[i]:从结点i出发,沿左上走经过的C之和。
修改A[i]:从结点i开始,沿右上修改经过的C。 - 函数代码:
inline int lowbit(int x)
{
return x & -x;
}
inline void add(int x, int d)
{
for(; x <= n; x += lowbit(x)) c[x] += d;
}
inline int sum(int x)
{
int s = 0;
for(; x; x -= lowbit(x)) s += c[x];
return s;
}
- 时间复杂度: 每个操作:O(log n);总操作:O(n * log n)