二叉索引树,俗称树状数组,也叫Fenwick树。
例:
给定一个n个元素的数组A1, A2, A3, ……, An, 设计一个数据结构,支持以下两种操作。
1、Add x y :让Ax增加y
2、Query L R :计算AL + AL+1 + …… + AR
#include <stdio.h> #include <string.h> int n, a[110], c[110]; int lowbit(int x) { return x & -x; } int sum(int x) { int ans = 0; while(x > 0) { ans += c[x]; x -= lowbit(x); } return ans; } void Query(int L, int R) { printf("%d\n", sum(R)-sum(L-1)); } void Add(int x, int y) { while(x <= n) { c[x] += y; x += lowbit(x); } } int main() { scanf("%d", &n); memset(c, 0, (n+1)*sizeof(int)); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 1; i <= n; i++) for(int j = i-lowbit(i)+1; j <= i; j++) c[i] += a[j]; int x, y; char cmd[10]; while(scanf("%s", cmd) != EOF) { if(cmd[0] == 'Q') { scanf("%d %d", &x, &y); Query(x, y); } else if(cmd[0] == 'A') { scanf("%d %d", &x, &y); Add(x, y); } } return 0; }