题意:在抗日战争期间,地道战在华北平原得到广泛的实施,一般而言,村庄通过一些隧道在一条线上连接,除了两端剩下的每个村庄都有两个相连。

侵略者会频繁的对这些村庄进行扫荡,并且摧他们的地道,当然八路军会把这一些已经被摧毁的村庄修复的,会优先修复最近被破坏的村庄。
分析:被这道题折磨了一上午啊,不过也学到了很多,尤其是这种涉及左右区间的。
*********************************************************************
  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<stack>
  4. using namespace std;
  5.  
  6. const int maxn = ;
  7.  
  8. struct node
  9. {//sum代表区间种最大的连续区间,lsum代表左端能到达的最右端的个数
  10.     int L, R, sum, lsum, rsum;
  11.     int Mid(){return (L+R)/;}
  12.     int Len(){return (R-L+);}
  13. }a[maxn*];
  14.  
  15. void Up(int r)
  16. {
  17.     a[r].lsum = a[r<<].lsum, a[r].rsum = a[r<<|].rsum;
  18.  
  19.     if(a[r<<].lsum == a[r<<].Len())
  20.         a[r].lsum = a[r<<].lsum + a[r<<|].lsum;
  21.     if(a[r<<|].rsum == a[r<<|].Len())
  22.         a[r].rsum = a[r<<|].rsum + a[r<<].rsum;
  23.  
  24.     a[r].sum = max(a[r].lsum, max(a[r].rsum, a[r<<].rsum+a[r<<|].lsum));
  25. }
  26. void Build(int r, int L, int R)
  27. {
  28.     a[r].= L, a[r].= R;
  29.     a[r].lsum = a[r].rsum = a[r].sum = a[r].Len();
  30.  
  31.     if(== R)return ;
  32.  
  33.     Build(r<<, L, a[r].Mid());
  34.     Build(r<<|, a[r].Mid()+, R);
  35. }
  36. void Insert(int r, int k, int e)
  37. {
  38.     if( a[r].== a[r].)
  39.     {
  40.         a[r].lsum = a[r].rsum = a[r].sum = e;
  41.         return ;
  42.     }
  43.  
  44.     if(<= a[r].Mid())
  45.         Insert(r<<, k, e);
  46.     else
  47.         Insert(r<<|, k, e);
  48.  
  49.     Up(r);
  50. }
  51. int  Query(int r, int k)
  52. {
  53.     if(a[r].sum == )return ;
  54.     if(< a[r].L+a[r].lsum)return a[r].lsum;//判断是否在左边
  55.     if(> a[r].R-a[r].rsum)return a[r].rsum;//判断是否在右边
  56.     if(> a[r<<].R-a[r<<].rsum && k < a[r<<|].L+a[r<<|].lsum)//判断是否在中间
  57.         return a[r<<].rsum + a[r<<|].lsum;
  58.  
  59.     if(<= a[r].Mid())
  60.         return Query(r<<, k);
  61.     else
  62.         return Query(r<<|, k);
  63. }
  64.  
  65. int main()
  66. {
  67.     int N, M;
  68.  
  69.     while(scanf("%d%d", &N, &M) != EOF)
  70.     {
  71.         int x; char s[];
  72.         stack<int> sta;
  73.  
  74.         Build(, , N);
  75.  
  76.         while(M--)
  77.         {
  78.             scanf("%s", s);
  79.  
  80.             if(s[] == 'D')
  81.             {
  82.                 scanf("%d", &x);
  83.                 Insert(, x, );
  84.                 sta.push(x);
  85.             }
  86.             else if(s[] == 'R' && sta.size())
  87.             {
  88.                 Insert(, sta.top(), );
  89.                 sta.pop();
  90.             }
  91.             else if(s[] == 'Q')
  92.             {
  93.                 scanf("%d", &x);
  94.                 printf("%d\n", Query(, x));
  95.             }
  96.         }
  97.     }
  98.  
  99.     return ; } 

I - Tunnel Warfare - hdu 1540(区间合并更新)的更多相关文章

  1. Tunnel Warfare HDU 1540 区间合并+最大最小值

    Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...

  2. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  3. (线段树 区间合并更新)Tunnel Warfare --hdu --1540

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1540 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  5. Tunnel Warfare 线段树 区间合并|最大最小值

    B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...

  6. Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  7. HDU1540 Tunnel Warfare —— 线段树 区间合并

    题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...

  8. hdu 1540 Tunnel Warfare 线段树 区间合并

    题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...

  9. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

随机推荐

  1. Manacher算法求回文半径

    http://wenku.baidu.com/link?url=WFI8QEEfzxng9jGCmWHoKn0JBuHNfhZ-tKTDMux34CeY8UNUwLVPeY5HA3TyoKU2XegX ...

  2. Python之路,Day13-----暂无正在更新中

    Python之路,Day13-----暂无正在更新中

  3. JavaScript调用后台的三种方法实例(包含两种Ajax)

    方法一:直接使用<%=%>调用(ASPX页面) 前台JS,代码如下: <script type="text/javascript"> var methodS ...

  4. 使用phpmailer发送邮件(以QQ邮箱为例)

    <?php   include("class/class.phpmailer.php"); //下载phpmailer并include两个文件  include(" ...

  5. python面对对象编程---------6:抽象基类

    抽象基本类的几大特点: 1:要定义但是并不完整的实现所有方法 2:基本的意思是作为父类 3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白 用抽象基本类的地方: 1:用作父类 2:用作检 ...

  6. break、continue和goto 三者作用介绍

    跳跃语句 由于break.continue和goto语句有助于跳跃到代码中的某个特定语句,因此它们属于跳跃语句.下面是这三个语句的介绍. ①break语句 这个语句常与switch语句联合使用:但是, ...

  7. GET or POST

    w3school中是这么说的: 与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用. 然而,在以下情况中,请使用 POST 请求: 无法使用缓存文件(更新服务器上的文件或数据库) 向服 ...

  8. CAS 4.0 配置开发手册(转)

    转:http://blog.csdn.net/ahpo/article/details/46412859 1    下载 地址http://downloads.jasig.org/ cas-serve ...

  9. [LeetCode OJ] Max Points on a Line—Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

    //定义二维平面上的点struct Point { int x; int y; Point(, ):x(a),y(b){} }; bool operator==(const Point& le ...

  10. Open vSwitch在openstackHavana概述

    最近再看Open vSwitch一些东西,我认为openstack官网上对这一块做了一些了解,所以就把这一块翻译出来以供参考,英语不好,翻译得很粗糙. Open vSwitch插件是最有名的核心插件之 ...