#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. Dubbox 环境搭建-新(Windows下)

    分布式服务框架 dubbo/dubbox 入门示例 dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http:// ...

  2. 使用PyCharm创建并运行一个Python项目

    (1)首先,在欢迎界面点击“Create New Project”: (2)在“New Project“左侧面板点击”Pure Python“,右侧Location选择自己要创建项目的路径(一般情况, ...

  3. 【WPF学习】第四十二章 透明

    WPF支持真正的透明效果.这意味着,如果在一个性质或元素上层叠另外几个形状或元素,并让所有这些形状和元素具有不同的透明度,就会看到所期望的效果.通过该特性能够创建透过上面的元素可以看到的的图像背景,这 ...

  4. java4选择结构 二

    public class jh_01_为什么使用switch选择结构 { /* * 韩嫣参加计算机编程大赛 * 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 * 如果获得第二名,将奖励惠普笔记 ...

  5. gulp 压缩文件2 摘

    一下代码用来简单的压缩 .js  和 .css   ;  在cmd里执行 gulp minifycss    minifyjs,各task执行是正常的. 注意,先安装后相应的模块,建议安装到本地. 说 ...

  6. bootstrap 表单类

    bootstrap 表单类 表单美化 用法: 向父元素 <form role="form"></form>     添加 role="form&q ...

  7. hive命令

    1.库命令:show databases; 查看所有库名select current_database(); 显示当前数据库:describe database publish; 查看某个库信息use ...

  8. 14-SSM整合

    今日知识 1. Spring整合MyBatis 2. SSM普通整合 3. SSM整合(Spring和SpringMVC分离) 4. 纯JavaConfig的SSM Spring整合MyBatis 1 ...

  9. css3 动画 示例

    /* animation */ .a-bounce,.a-flip,.a-flash,.a-shake,.a-swing,.a-wobble,.a-ring{-webkit-animation:1s ...

  10. 工程引用libm.a文件的sin函数后

    更改前后的main.c //#include <math.h> ; int var_bss; int main() { double d; // d = sin(3.14/2); ; } ...