Tunnel Warfare HDU 1540 区间合并+最大最小值
Tunnel Warfare HDU 1540 区间合并+最大最小值
题意
D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。
题解思路
这里巧妙使用了最大值最小值来进行区间的查找。上一行是大佬的详细题解,真的很妙啊。
代码实现
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((t[rt].l+t[rt].r)>>1)
using namespace std;
const int maxn=5e4+7;
struct node{
int l, r, maxx, minn; //维护区间内的最大最小值
}t[maxn<<2];
stack<int> des;
int n, m;
void pushup(int rt)
{
t[rt].maxx=max(t[ls].maxx, t[rs].maxx);
t[rt].minn=min(t[ls].minn, t[rs].minn);
}
void build(int rt, int l, int r)
{
t[rt].l=l;
t[rt].r=r;
if(l==r)
{
t[rt].maxx=0; //最大值默认都是0
t[rt].minn=n+1; //最小值默认都是n+1
return ;
}
build(ls, l, mid);
build(rs, mid+1, r);
//pushup(rt);
t[rt].maxx=max(t[ls].maxx, t[rs].maxx);
t[rt].minn=min(t[ls].minn, t[rs].minn);
}
void destory(int rt, int x)
{
if(t[rt].l==t[rt].r)
{
t[rt].maxx=t[rt].l;
t[rt].minn=t[rt].l;
return ;
}
if(x<=mid) destory(ls, x);
else destory(rs, x);
//pushup(rt);
t[rt].maxx=max(t[ls].maxx, t[rs].maxx);
t[rt].minn=min(t[ls].minn, t[rs].minn);
}
void rebuild(int rt, int x)
{
if(t[rt].l==t[rt].r)
{
t[rt].maxx=0;
t[rt].minn=n+1;
return ;
}
if(x<=mid) rebuild(ls, x);
else rebuild(rs, x);
//pushup(rt);
t[rt].maxx=max(t[ls].maxx, t[rs].maxx);
t[rt].minn=min(t[ls].minn, t[rs].minn);
}
int query_max(int rt, int l, int r)
{
if(l<=t[rt].l && t[rt].r <= r)
{
return t[rt].maxx;
}
int ans=0;
if(l<=mid) ans=max(ans, query_max(ls, l, r));
if(r>mid) ans=max(ans, query_max(rs, l, r));
return ans;
}
int query_min(int rt, int l, int r)
{
if(l<=t[rt].l && t[rt].r <= r)
{
return t[rt].minn;
}
int ans=0x3f3f3f3f;
if(l<=mid) ans=min(ans, query_min(ls, l, r));
if(r>mid) ans=min(ans, query_min(rs, l, r));
return ans;
}
int main()
{
char op[3];
int x;
while( scanf("%d%d", &n, &m)!=EOF)
{
while(!des.empty()) des.pop();
build(1, 1, n);
for(int i=1; i<=m; i++)
{
scanf("%s", op);
if(op[0]=='D')
{
scanf("%d", &x);
des.push(x);
destory(1, x);
}
else if(op[0]=='Q')
{
scanf("%d", &x);
int maxx=query_max(1, 1, x);
int minn=query_min(1, x, n);
if(maxx==minn)
printf("0\n");
else printf("%d\n", minn-maxx-1);
}
else {
x=des.top();
des.pop();
rebuild(1, x);
}
}
}
return 0;
}
Tunnel Warfare HDU 1540 区间合并+最大最小值的更多相关文章
- Tunnel Warfare 线段树 区间合并|最大最小值
B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...
- E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并
E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...
- (线段树 区间合并更新)Tunnel Warfare --hdu --1540
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1540 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- HDU1540 Tunnel Warfare —— 线段树 区间合并
题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...
- I - Tunnel Warfare - hdu 1540(区间合并更新)
题意:在抗日战争期间,地道战在华北平原得到广泛的实施,一般而言,村庄通过一些隧道在一条线上连接,除了两端剩下的每个村庄都有两个相连. 侵略者会频繁的对这些村庄进行扫荡,并且摧他们的地道,当然八路军会把 ...
- hdu 1540 Tunnel Warfare 线段树 区间合并
题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...
- Tunnel Warfare HDU - 1540 (线段树不同子树的合并)
在抗日战争期间,华北平原广大地区进行了大规模的隧道战. 一般来说,通过隧道连接的村庄排成一列. 除了两端,每个村庄都与两个相邻的村庄直接相连. 入侵者经常对一些村庄发动袭击并摧毁其中的部分隧道. 八路 ...
随机推荐
- C++HeartCode
#include <iostream> int main() { int A=43,B=A/2, C=B/2,x,y,i=B,j=-C;for(y=0;y<B;j=(++y)-(C+ ...
- Vue最常用的组件通讯有三种:父->子组件通讯、子->父组件通讯,兄弟组件通讯.(template用的pug模板语法)
Vue组件通讯 Vue最常用的组件通讯有三种:父->子组件通讯.子->父组件通讯,兄弟组件通讯.(template用的pug模板语法) 1.父->子组件通讯 父->子组件通 ...
- HTML5基础内容(二)
HTML(HyperText Markup Language)超文本标记语言 一.HTML注释 元素就是标签,标签就是元素. 注释中的内容不会在页面中显示,但是可以在源码中看到. 可以通过编写注释来对 ...
- 事物Spring boot @Transactional
事物:dr @Override @UDS(value="fq") @Transactional public BaseResultMessage testTransactional ...
- [springboot jpa] [bug] Could not open JPA EntityManager for transaction
前言 最近,测试环境遇到了一个问题.经过一番百度加谷歌,终于解决了这个问题.写下这篇博客是为了记录下解决过程,以便以后查看.也希望可以帮助更多的人. 环境 java版本:8 框架:spring clo ...
- Linux中相关知识(atexit(),fork(),粘滞位)
1.atexit()函数 函数名: atexit 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(v ...
- sql分别用日期、月、年 分组 group by 分组,datepart函数
标签: datepart函数sql分别用日期月年 分组group by 分组 2013-12-26 15:31 20764人阅读 评论(1) 收藏 举报 分类: SQL Server(21) 版权声明 ...
- Microsoft Visual Studio 2013 Language Pack
Microsoft Visual Studio 2013 Language Pack Microsoft Visual Studio 2013 各版本语言包下载地址: https://my.visua ...
- cmd 编码修改。 牛阿。 解决问题
http://jingyan.baidu.com/article/e75aca85440f01142edac636.html 命令窗口修改编码,CMD编码修改方法 听语音 | 浏览:9696 | 更新 ...
- 【ABAP系列】SAP ABAP ALV合计或者小计 添加自定义文本
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP ALV合计或者小计 ...