思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n)

没想到自己以前把这道题当线段树的单点更新刷了。

树状数组:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = 5e4 + ;
  6. int tree[maxn], n;
  7. void add(int k, int num)
  8. {
  9. while (k <= n)
  10. {
  11. tree[k] += num;
  12. k += k&-k;
  13. }
  14. }
  15. int sum(int k)
  16. {
  17. int sum = ;
  18. while (k)
  19. {
  20. sum += tree[k];
  21. k -= k&-k;
  22. }
  23. return sum;
  24. }
  25. int main()
  26. {
  27. int t, x, y, k=;
  28. scanf("%d", &t);
  29. while (t--)
  30. {
  31. memset(tree, , sizeof(tree));
  32. scanf("%d", &n);
  33. for (int i = ; i <= n; ++i)
  34. {
  35. scanf("%d", &x); add(i, x);
  36. }
  37. char num[];
  38. printf("Case %d:\n", ++k);
  39. while (scanf("%s", num), strcmp(num, "End") != )
  40. {
  41. scanf("%d%d", &x, &y);
  42. if (strcmp(num,"Add")==){ add(x, y); }
  43. else if (strcmp(num,"Sub")==){ add(x, -y); }
  44. else{ printf("%d\n", sum(y) - sum(x-)); }
  45. }
  46. }
  47. }

线段树

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. #define MID(a,b) (a+((b-a)>>1))
  6. #define MAXN int(1e4)*5+5
  7. struct node
  8. {
  9. int l, r;
  10. int sum;
  11. int mid(){ return MID(l, r); }
  12. };
  13.  
  14. int num[MAXN], n;
  15.  
  16. struct Tree
  17. {
  18. node tree[MAXN << ];
  19. void build(int L, int R, int pos)
  20. {
  21. tree[pos].l = L; tree[pos].r = R; //表示区间
  22. tree[pos].sum = ;
  23. if (L == R){tree[pos].sum = num[R]; return; }//到了子叶
  24. int mid = tree[pos].mid();
  25. //二分
  26. build(L, mid, pos<<);
  27. build(mid + , R, pos << | );
  28. tree[pos].sum = tree[pos << ].sum + tree[pos << | ].sum;
  29. }
  30. //valu 表示加的值, ind 表示第几个军营。(在区域中的位置)
  31. void updata(int ind, int pos, int valu)
  32. {
  33. if (tree[pos].l == tree[pos].r)
  34. {
  35. tree[pos].sum += valu; return; //叶节点+valu
  36. }
  37. int mid = tree[pos].mid();
  38. //二分查找单点位置?
  39. if (ind <= mid) updata(ind, pos << , valu);
  40. else updata(ind, pos << | , valu);
  41. tree[pos].sum = tree[pos << ].sum + tree[pos << | ].sum;
  42. //递归,覆盖上一层的sum
  43. }
  44. //查询
  45. int query(int L, int R, int pos)//从根节点查到符合的区间节点
  46. {
  47. if (L <= tree[pos].l&&tree[pos].r <= R) return tree[pos].sum;
  48. int mid = tree[pos].mid();
  49. int sum1 = , sum2 = ;
  50. if (L <= mid) sum1 = query(L, R, pos << );
  51. if (R > mid) sum2 = query(L, R, pos << | );
  52. return sum1 + sum2;
  53. }
  54. };
  55. Tree tree;
  56. int main()
  57. {
  58. int x, y;
  59. int t, n,t_case=;
  60. scanf("%d", &t);
  61. while (t--)
  62. {
  63. char ch[];
  64. scanf("%d", &n);
  65. printf("Case %d:\n", ++t_case);
  66. for (int i = ; i <= n; i++)
  67. scanf("%d", &num[i]);
  68. tree.build(, n, );
  69. while (scanf("%s", ch) != EOF)
  70. {
  71. if (strcmp(ch, "End") == ) break;
  72. else if (strcmp(ch,"Add")==)
  73. {
  74. scanf("%d%d", &x, &y);
  75. tree.updata(x, , y);
  76. }
  77. else if (strcmp(ch, "Sub") == )
  78. {
  79. scanf("%d%d", &x, &y);
  80. tree.updata(x, , -y);
  81. }
  82. else if (strcmp(ch, "Query") == )
  83. {
  84. scanf("%d%d", &x, &y);
  85. printf("%d\n", tree.query(x, y, ));
  86. }
  87. }
  88. }
  89. return ;
  90. }

敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)的更多相关文章

  1. 敌兵布阵 HDU 1166 线段树

    敌兵布阵 HDU 1166 线段树 题意 这个题是用中文来描写的,很简单,没什么弯. 解题思路 这个题肯定就是用线段树来做了,不过当时想了一下可不可用差分来做,因为不熟练就还是用了线段树来做,几乎就是 ...

  2. HDU 1166敌兵布阵+NOJv2 1025: Hkhv love spent money(线段树单点更新区间查询)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  4. [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)

    这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...

  5. bzoj4785:[ZJOI2017]树状数组:二维线段树

    分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...

  6. A - 敌兵布阵 HDU - 1166 线段树(多点修改当单点修改)

    线段树板子题练手用 #include<cstdio> using namespace std; ; int a[maxn],n; struct Node{ int l,r; long lo ...

  7. A - 敌兵布阵 - hdu 1166

    Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些 ...

  8. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

  9. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

随机推荐

  1. [SCOI2015] 情报传递

    题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有 n 名情报员.每名情报员可能有若干名 (可能没有) 下线,除 1 名大头目外其余 n−1 名情报员有且仅有 1 名上线.奈 ...

  2. c# 判断是否是手机访问

    public static bool CheckAgent() { bool flag = false; string agent = HttpContext.Current.Request.User ...

  3. Java框架之Spring(三)

    本文主要介绍Spring中, 1 Bean 的 init-method 和 destroy-method 2 集合类型的装配 3 注解方式装配 4 以自动扫描把组件纳入spring容器中管理 5 代理 ...

  4. Cylinder Candy(积分+体积+表面积+旋转体)

    Cylinder Candy Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Edward the confectioner is ...

  5. How does this enqueue function work?

    Question: I'm having trouble understanding this line: rear->next = temp; in this queue function: ...

  6. 自定义jq插件,鼠标悬浮展示图片或者视频放大图,可自定义展示内容

    网站项目经常会遇到一些视频或者图片素材的展示功能,那么就需要自己写一个功能,就是在一些列表页面你想要是这个数据的详细内容,弹框在页面某个位置 例如这是视频悬浮展示效果,可自定义自动播放等属性标签 又例 ...

  7. CSS属性之position讲解

    postion 属性定义了一个元素在页面布局中的位置以及对周围元素的影响.该属性共有5个值: position: static position: inherit position: relative ...

  8. Echarts简单案例

    官网: http://echarts.baidu.com/index.html 文档:  http://echarts.baidu.com/echarts2/doc/doc.html <html ...

  9. 定时器setTimeout实现函数节流

    问题描述 文字输入查询的keyup或oninput事件,实现实时查询功能. 在用户输入过程中,用户可能只想需要 '小' 字的查询结果,但是以上两个事件会触发'x'.'i'.'a'.'o'.'小',一共 ...

  10. MSys2安装QT5

    1. MSYS2 shell # pacman –Syuu 2. Reopen MSYS2 # pacman –Syuu 3.添加国内源 msys64\etc\pacman.d 目录下有三个文件 1. ...