首页 > 代码库 > hdu 1166 敌兵布阵 解题报告
hdu 1166 敌兵布阵 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query 的时候,需要计算出 某个区间的和。
树状数组第一题,算是模板吧 ^_^
有个小细节,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,下次就能得到834 }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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。