题目地址:

pid=1166">HDU 1166

听说胡浩版的线段树挺有名的。

于是就拜訪了一下他的博客。详情戳这里。于是就全然仿照着胡浩大牛的风格写的代码。

至于原理。鹏鹏学长已经讲的再清晰只是了。

我就在以下的代码凝视中将原理说明一下吧。来纪念第一发线段树。

以下是代码+凝视。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <math.h>
  5. #include <stack>
  6. using namespace std;
  7. #define lson l, mid, rt<<1//直接定义子节点,由于每次都要用到,所以直接定义一个非常方便
  8. #define rson mid+1, r, rt<<1 | 1
  9. const int MAXN=51000;
  10. int sum[MAXN<<2];
  11. void PushUP(int rt)//向上更新父节点的值
  12. {
  13. sum[rt]=sum[rt<<1]+sum[rt<<1|1];
  14. }
  15. void build(int l, int r, int rt)//建立二叉树
  16. {
  17. if(l==r)//已经到达最底端的叶子节点,即单点,直接输入该值
  18. {
  19. scanf("%d",&sum[rt]);
  20. return ;
  21. }
  22. int mid=(l+r)>>1;
  23. build(lson);//向左子节点继续建立二叉树
  24. build(rson);//向右子节点继续建立二叉树
  25. PushUP(rt);//所有建立完后向上更新父节点的值
  26. }
  27. void update(int p, int x, int l, int r, int rt)//单点改动
  28. {
  29. if(l==r)//说明已经到了最底端的叶子节点,已经是单点了,能够直接改动该值
  30. {
  31. sum[rt]+=x;
  32. return ;
  33. }
  34. int mid=(l+r)>>1;
  35. if(p<=mid) update(p,x,lson);//假设要改动的值在这个区间左边,就进入左子节点继续寻找
  36. else update(p,x,rson);//假设要改动的值在这个区间右边,就进入右子节点继续寻找
  37. PushUP(rt);//改动完后。仍然要向上更新父节点的值
  38. }
  39. int query(int ll, int rr, int l, int r, int rt)//区间查询
  40. {
  41. if(ll<=l&&rr>=r)//假设要查询的区间全然覆盖了该子节点。直接返回该子节点的值
  42. return sum[rt];
  43. int mid=(l+r)>>1;
  44. int ans=0;
  45. if(ll<=mid) ans+=query(ll,rr,lson);//假设在该子节点左边另一部分要查询的区间。就去左子树继续查询
  46. if(rr>mid) ans+=query(ll,rr,rson);//假设在该子节点右边另一部分要查询的区间,就去右子树继续查询
  47. return ans;
  48. }
  49. int main()
  50. {
  51. int t, n, i, a, b, ans, num=0;
  52. char s[20];
  53. scanf("%d",&t);
  54. while(t--)
  55. {
  56. num++;
  57. printf("Case %d:\n",num);
  58. memset(sum,0,sizeof(sum));
  59. scanf("%d",&n);
  60. build(1,n,1);//建立
  61. /*for(i=1;i<=25;i++)
  62. {
  63. printf("%d %d\n",i,sum[i]);
  64. }*/
  65. getchar();
  66. while(scanf("%s",s))
  67. {
  68. if(s[0]=='E') break;
  69. if(!strcmp(s,"Add"))
  70. {
  71. scanf("%d%d",&a,&b);
  72. update(a,b,1,n,1);//改动
  73. }
  74. else if(!strcmp(s,"Sub"))
  75. {
  76. scanf("%d%d",&a,&b);
  77. update(a,-b,1,n,1); //改动
  78. }
  79. else
  80. {
  81. scanf("%d%d",&a,&b);
  82. ans=query(a,b,1,n,1);//查询
  83. printf("%d\n",ans);
  84. }
  85. }
  86. }
  87. return 0;
  88. }

HDU 1166 敌兵布阵(线段树)的更多相关文章

  1. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  2. hdu 1166 敌兵布阵 线段树 点更新

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

  3. HDU 1166 敌兵布阵(线段树单点更新,板子题)

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

  4. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  5. HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>

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

  7. hdu 1166 敌兵布阵 (线段树、单点更新)

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

  8. hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题

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

  9. HDU 1166 敌兵布阵 线段树

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

  10. HDU 1166 - 敌兵布阵 - [线段树][树状数组]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

随机推荐

  1. Oracle11G 数据库 expdp、impdp使用示例

    expdp 备份数据库.expdp/impdp简单测试 操作系统层面创建目录 [root@Oracle11g ~]# mkdir -p /home/oracle/db_back/ 修改目录的所属用户. ...

  2. [转] NSString / NSMutableString 字符串处理,常用代码

     原文 :  http://justcoding.iteye.com/blog/1405951 Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString , ...

  3. unexpected nil window in _UIApplicationHandleEventFromQueueEvent...

    unexpected nil window in _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: <UI ...

  4. 开始Swift之旅 - HelloWorld

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  5. js 去掉浏览器右击默认事件

    1.整个页面所有的右击事件 document.oncontextmenu = function(){ return false; } 2.特定的区域 document.getElementById(& ...

  6. The ultimate jQuery Plugin List(终极jQuery插件列表)

    下面的文章可能出自一位奥地利的作者,  列出很多jQuery的插件.类似的网站:http://jquerylist.com/原文地址: http://www.kollermedia.at/archiv ...

  7. 文件操作-php

    <?php /* 建立缓存 可以用文件长时间保存数据 文件是以liunux为模型的 在Windows下只能获取file ,dir unknow linux 下可以获取block char dir ...

  8. JavaScript设计模式之构造函数模式

    一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...

  9. 初涉JavaScript模式 (13) : 代码复用 【上】

    引子 博客断了一段时间,不是不写,一是没时间,二是觉得自己沉淀不够,经过一段时间的学习和实战,今天来总结下一个老生常谈的东西: 代码复用. 为何复用 JS门槛低,故很多人以为写几个特效就会JS,其实真 ...

  10. centOS 7配置Apache + MySQL + PHP

    一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: #停止firewall服务 sys ...