#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=+;
struct node{
int l,r;
int maxx;
int minn;
} tr[N*];
//保存历史记录,被毁的
int history[N*];
int n,m;
void build(int i,int l,int r)
{
tr[i].l=l;
tr[i].r=r;
if(l==r)
{
//初始化
//i到n的最小
tr[i].minn=n+;
//1到i的最大
tr[i].maxx=;
return;
}
int mid=(l+r)>>;
build(i<<,l,mid);
build(i<<|,mid+,r);
tr[i].maxx=max(tr[i*].maxx,tr[i*+].maxx);
tr[i].minn=min(tr[i*].minn,tr[i*+].minn);
}
//更新最小值
void updateMin(int i,int id,int val)
{
if(tr[i].l==tr[i].r)
{
tr[i].minn=val;
return;
}
int mid=tr[i].l+tr[i].r>>;
if(id<=mid)
updateMin(i*,id,val);
else
updateMin(i*+,id,val); tr[i].minn=min(tr[i*].minn,tr[i*+].minn);
}
//更新最大值
void updateMax(int i,int id,int val)
{
if(tr[i].l==tr[i].r)
{
tr[i].maxx=val;
return;
}
int mid=(tr[i].l+tr[i].r)/;
if(id<=mid)
updateMax(i*,id,val);
else
updateMax(i*+,id,val); tr[i].maxx=max(tr[i*].maxx,tr[i*+].maxx);
}
//查询最小值
int queryMin(int i,int ql,int qr)
{
//当前区间在目标区间内
if(ql<=tr[i].l&&qr>=tr[i].r)
return tr[i].minn;
int mid=(tr[i].l+tr[i].r)/;
int res=INF;
if(ql<=mid)
res=min(res,queryMin(i*,ql,qr));
if(qr>mid)
res=min(res,queryMin(i*+,ql,qr));
return res;
}
//查询最大值
int queryMax(int i,int ql,int qr)
{
//当前区间在目标区间内
if(ql<=tr[i].l&&qr>=tr[i].r)
return tr[i].maxx;
int mid=(tr[i].l+tr[i].r)/;
int res=;
if(ql<=mid)
res=max(res,queryMax(i*,ql,qr));
if(qr>mid)
res=max(res,queryMax(i*+,ql,qr));
return res;
}
int main()
{ while(scanf("%d%d",&n,&m)!=EOF)
{
build(,,n);
int cnt=;
memset(history,,sizeof history );
while(m--){
char str[];
scanf("%s",str);
//破坏
if(str[]=='D')
{
int x;
scanf("%d",&x);
//把x对应的值更新成x //初始化时,默认1到x最大到结尾
//x到n最小到开头0 //现在更新为自己, //如果查询的区间包括x,最大最小都会返回x或者其他被毁的
updateMax(,x,x);
updateMin(,x,x);
//记录被毁的
history[++cnt]=x;
}
//查询
else if(str[]=='Q')
{
int x;
scanf("%d",&x);
int maxx=queryMax(,,x);
int minn=queryMin(,x,n);
//特判
//如果最大最小相同,说明自身被毁
if(maxx==minn)
printf("0\n");
else
//从当前点往后的最小,也就是最近的被毁的
//从当前点往前最大的,也就是最近的被毁的
//做差再减去1就是长度
printf("%d\n",minn-maxx-);
}
else
{
//恢复最后被毁的,将对应初始值改回
int temp=history[cnt--];
updateMin(,temp,n+);
updateMax(,temp,);
}
}
}
return ;
}

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 (线段树处理连续区间问题)

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

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

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

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

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

  6. I - Tunnel Warfare - hdu 1540(区间合并更新)

    题意:在抗日战争期间,地道战在华北平原得到广泛的实施,一般而言,村庄通过一些隧道在一条线上连接,除了两端剩下的每个村庄都有两个相连. 侵略者会频繁的对这些村庄进行扫荡,并且摧他们的地道,当然八路军会把 ...

  7. I - Tunnel Warfare HDU - 1540 线段树最大连续区间

    题意  :一段区间  操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间 思路:  主要是push_up :  设区间x 为母区间  x<<1 ,x< ...

  8. Tunnel Warfare HDU - 1540(线段树最长连续区间)

    题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点.   解析: 线段树结点 设置一个  lq记录区间左端点开始的最大连续个数,  rq ...

  9. Tunnel Warfare HDU - 1540 (线段树不同子树的合并)

    在抗日战争期间,华北平原广大地区进行了大规模的隧道战. 一般来说,通过隧道连接的村庄排成一列. 除了两端,每个村庄都与两个相邻的村庄直接相连. 入侵者经常对一些村庄发动袭击并摧毁其中的部分隧道. 八路 ...

随机推荐

  1. Dubbo(三):深入理解Dubbo源码之如何将服务发布到注册中心

    一.前言 前面有说到Dubbo的服务发现机制,也就是SPI,那既然Dubbo内部实现了更加强大的服务发现机制,现在我们就来一起看看Dubbo在发现服务后需要做什么才能将服务注册到注册中心中. 二.Du ...

  2. 探究HashMap1.8的扩容

    扩容前 扩容后 机制 else { // preserve order Node<K,V> loHead = null, loTail = null;//低指针 Node<K,V&g ...

  3. nginx命令行及演示:重载、热部署、日志切割

    重载配置文件 nginx -s reload 热部署(升级nginx) 首先备份二进制文件 cp nginx nginx.old  拷贝新版本的nginx替换以前的nginx二进制文件 cp  ngi ...

  4. WTL使用双缓冲避免重绘闪烁

    1.继承自CDoubleBufferImpl template <class T> class CDoubleBufferImpl { public: // Overrideables v ...

  5. HDU4192 Guess the Numbers(表达式计算、栈)

    题意: 给你一个带括号.加减.乘的表达式,和n个数$(n\leq 5)$,问你带入这几个数可不可能等于n 思路: 先处理表达式:先将中缀式转化为逆波兰表达式 转换过程需要用到栈,具体过程如下:1)如果 ...

  6. num10---适配器模式

    1.类适配器 Adapter类,通过继承 被适配的类,实现目标类的接口,完成适配. 分析: java 单继承,所以适配器类 需要继承 被适配类,这就要求目标类必须是接口,有一定局限性. 被适配类的方法 ...

  7. Nginx安装(yum源)

    CentOS7 $ vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/c ...

  8. Nginx-2.初学者使用

    原文 Nginx有一个master进程和几个worker进程.master进程用来读取和评估配置文件,以及维护worker进程.worker进程用来处理实际的请求.Nginx使用事件模型和基于操作系统 ...

  9. 本地与github建立连接,本地代码上传到github

    1,已有github账号 2,本地已经安装git 3,本地创建ssh-key 在git bash中输入后直接回车. $ ssh-keygen -t rsa -C "your_email@yo ...

  10. ASPNetCore 发布到IIS

    ASPNetCore 发布到IIS 准备工作 1.1.  安装IIS.(具体操作不再说明) 安装成功后再浏览器输入localhost得到的页面如下 1.2.  安装dotnet-hosting-2.2 ...