hdu 1166 敌兵布阵 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query 的时候,需要计算出 某个区间的和。
树状数组第一题,算是模板吧 ^_^
这个人写得比较容易理解:http://blog.csdn.net/shahdza/article/details/6314818
权威版:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees
有个小细节,wa 了几次,细心~细心~~~细心
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 using namespace std; 7 8 const int maxn = 5e4 + 5; 9 int c[maxn]; 10 int n; 11 12 int lowbit(int x) // 求某个点的管辖范围 13 { 14 return x & (-x); 15 } 16 17 int query(int x) 18 { 19 int s = 0; 20 while (x > 0) 21 { 22 s += c[x]; 23 x -= lowbit(x); // 得到 x 这个点的管辖区间的下个区间的管辖点 24 } 25 return s; 26 } 27 28 void insert(int x, int num) 29 { 30 while (x <= n) 31 { 32 c[x] += num; 33 x += lowbit(x); // 得到的该点的父节点的值,比如x = 4,下次就能得到8 34 } 35 36 } 37 38 int main() 39 { 40 int T, tmp; 41 while (scanf("%d", &T) != EOF) 42 { 43 for (int j = 1; j <= T; j++) 44 { 45 memset(c, 0, sizeof(c)); // 一开始不记得写这个,错了,细心啊~~~~ 46 scanf("%d", &n); 47 for (int i = 1; i <= n; i++) 48 { 49 scanf("%d", &tmp); 50 insert(i, tmp); 51 } 52 printf("Case %d:\n", j); 53 string command; 54 int l, r; 55 while (cin >> command) 56 { 57 if (command == "End") 58 break; 59 scanf("%d%d", &l, &r); 60 if (command == "Query") 61 printf("%d\n", query(r)-query(l-1)); 62 else if (command == "Add") 63 insert(l, r); 64 else if (command == "Sub") 65 insert(l, -r); 66 } 67 } 68 } 69 return 0; 70 }