#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. Java爬虫框架之WebMagic

    一.介绍 WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 二.如何学习 1.查看官网 官网地址为:http://webmagic.io ...

  2. 命令行压缩解压缩一 7z

    命令行压缩解压缩一 7z  1) 简介  7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压缩软件.  主页:http://www.7-zip.org/  中文主页:http: ...

  3. 教你5分钟做个手机APP[视频]

    天天宅在家里,没什么事做,录个教学视频吧! 发到了视频网站上去根本没人看,伤心ing啊! 不知cnblogs上面是否让我发! 先上一张效果图看看哈: 如果播放不正常请点这里:https://www.b ...

  4. Codeforces_734_C

    http://codeforces.com/problemset/problem/734/C 枚举第一种,二分第二种,注意不取的情况. #include<iostream> #includ ...

  5. 高软期末考试 B2C模式

    一.软件工程知识点 简要总结 1.软件基础知识 瀑布模型: 我感觉整个<软件工程>书的布局就是按照瀑布模型来的,上面右图少个运维. 2.UML图 2.1 用例图 UseCase Diagr ...

  6. 基于Go的马蜂窝旅游网分布式IM系统技术实践

    一.引言 即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商. 从商品复杂性来看,一个旅游商品可能会包括用户在未来一段时间的衣.食.住.行等方方面面.从消费金额来看,往往单次消费额度较大.对 ...

  7. 浅谈Go语言的Goroutine和协程

    0x00.前言 前面写了一篇初识Go语言和大家一起学习了Go语言的巨大潜力.语言简史.杀手锏特性等,感兴趣的读者可以回顾一下. 今天来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人 ...

  8. Python socket 基础(Server) - Foundations of Python Socket

    Python socket 基础 Server - Foundations of Python Socket 通过 python socket 模块建立一个提供 TCP 链接服务的 server 可分 ...

  9. objectarx 多段线自交检查

    只支持直线段的多段线检查,因为主要用了初中的知识,一元一次方程求交点,详细的说就是,把多段线上相邻的两个点构成一条直线段,然后每条直线段与剩余的直线段求交点,一条直线段就代表一个一元一次方程,知道两点 ...

  10. php基础编程-php连接mysql数据库-mysqli的简单使用

    很多php小白在学习完php基础后,或多或少要接触到数据库的使用.而mysql数据库是你最好的选择,本文就mysql来为大家介绍php如何连接到数据库. PHP MySQLi = PHP MySQL ...