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

侵略者会频繁的对这些村庄进行扫荡,并且摧他们的地道,当然八路军会把这一些已经被摧毁的村庄修复的,会优先修复最近被破坏的村庄。
分析:被这道题折磨了一上午啊,不过也学到了很多,尤其是这种涉及左右区间的。
*********************************************************************
#include<stdio.h>
#include<algorithm>
#include<stack>
using namespace std; const int maxn = ; struct node
{//sum代表区间种最大的连续区间,lsum代表左端能到达的最右端的个数
    int L, R, sum, lsum, rsum;
    int Mid(){return (L+R)/;}
    int Len(){return (R-L+);}
}a[maxn*]; void Up(int r)
{
    a[r].lsum = a[r<<].lsum, a[r].rsum = a[r<<|].rsum;     if(a[r<<].lsum == a[r<<].Len())
        a[r].lsum = a[r<<].lsum + a[r<<|].lsum;
    if(a[r<<|].rsum == a[r<<|].Len())
        a[r].rsum = a[r<<|].rsum + a[r<<].rsum;     a[r].sum = max(a[r].lsum, max(a[r].rsum, a[r<<].rsum+a[r<<|].lsum));
}
void Build(int r, int L, int R)
{
    a[r].L = L, a[r].R = R;
    a[r].lsum = a[r].rsum = a[r].sum = a[r].Len();     if(L == R)return ;     Build(r<<, L, a[r].Mid());
    Build(r<<|, a[r].Mid()+, R);
}
void Insert(int r, int k, int e)
{
    if( a[r].L == a[r].R )
    {
        a[r].lsum = a[r].rsum = a[r].sum = e;
        return ;
    }     if(k <= a[r].Mid())
        Insert(r<<, k, e);
    else
        Insert(r<<|, k, e);     Up(r);
}
int  Query(int r, int k)
{
    if(a[r].sum == )return ;
    if(k < a[r].L+a[r].lsum)return a[r].lsum;//判断是否在左边
    if(k > a[r].R-a[r].rsum)return a[r].rsum;//判断是否在右边
    if(k > a[r<<].R-a[r<<].rsum && k < a[r<<|].L+a[r<<|].lsum)//判断是否在中间
        return a[r<<].rsum + a[r<<|].lsum;     if(k <= a[r].Mid())
        return Query(r<<, k);
    else
        return Query(r<<|, k);
} int main()
{
    int N, M;     while(scanf("%d%d", &N, &M) != EOF)
    {
        int x; char s[];
        stack<int> sta;         Build(, , N);         while(M--)
        {
            scanf("%s", s);             if(s[] == 'D')
            {
                scanf("%d", &x);
                Insert(, x, );
                sta.push(x);
            }
            else if(s[] == 'R' && sta.size())
            {
                Insert(, sta.top(), );
                sta.pop();
            }
            else if(s[] == 'Q')
            {
                scanf("%d", &x);
                printf("%d\n", Query(, x));
            }
        }
    }     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. Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)

    Python 面向对象(初级篇)   51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...

  2. Web api 文档以及测试工具配置

    第一步: 创建web api 在nuget 上搜索 webapitestclient (包含预发行版) 然后在 /Areas/HelpPage/Views/Help/Api.cshtml 末尾 添加 ...

  3. android自定义listview实现圆角

    在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...

  4. (转)浅谈dedecms模板引擎工作原理及自定义标签

    理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...

  5. (转)MySQL数据库命名规范及约定

    一.[操作规范]1. 如无备注,则表中的第一个id字段一定是主键且为自动增长:2. 如无备注,则数值类型的字段请使用UNSIGNED属性:3. 如无备注,排序字段order_id在程序中默认使用降序排 ...

  6. centos5.2 x86 安装 oracle 11g2r 日志

    一.安装centos 二.安装ora所需的库 三.修改centos内核 四.建用户组和目录结构等 五.安装ora11g2r 六.安装sqlplus的翻页程序和help补丁 七.自启动脚本 八.常用命令 ...

  7. UIBarButtonItem-添加自定义Left或者Right按钮 <总结>

    为UINavigationController添加UINavigationItem   1.添加返回导航按钮backBarButtonItem   1.用系统自带的返回按钮 UIBarButtonIt ...

  8. POJ 2395 Out of Hay(最小生成树中的最大长度)

    POJ 2395 Out of Hay 本题是要求最小生成树中的最大长度, 无向边,初始化es结构体时要加倍,别忘了init(n)并查集的初始化,同时要单独标记使用过的边数, 判断ans==n-1时, ...

  9. 你好,C++(10)这次的C++考试你过了没有?C++中表示逻辑判断的布尔数据类型

    3.4  布尔类型 在日常生活中,我们除了需要使用int类型的变量表示216路公交车:需要使用float类型的变量表示西红柿3.5元一斤,有时候还需要表示一种数据,那就是逻辑状态: “这次的C++考试 ...

  10. php把excel数值格式转成日期格式问题

    在excel中:40847对应2011-10-31,是日期的数值型表现形式. 在PHP中,echo date('Y-m-d H:i:s',40847);//结果1970-01-01 11:52:30 ...