1.数组公式: S[i] = d[i - 2^k + 1] + d[i - 2^(k - 1) + 1] .... + d[i]
*k表示i的二进制形式从右起直到第一个1为止0的个数。
比如(168)10 = (10101000)2 则 k = 3
(11)10 = (1011)2 则k = 0
2.求2^k: 2^k = (i & i ^ (i - 1)) = (i & -i)
3.树数组的查询和更新的复杂度都为O(logn)
公式如图:
图片摘自:
Template:
void UpdateTree(int x, int num) {
while(x < MAX_VALUE) {
treedat[x] += num;
x += (x&-x);
}
}
int GetSum(int x) {
int sum = 0;
while (x > 0) {
sum += treedat[x];
x -= (x & -x);
}
return sum;
}