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 区间合并+最大最小值的更多相关文章

  1. Tunnel Warfare 线段树 区间合并|最大最小值

    B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...

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

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

  6. HDU1540 Tunnel Warfare —— 线段树 区间合并

    题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...

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

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

  8. hdu 1540 Tunnel Warfare 线段树 区间合并

    题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...

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

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

随机推荐

  1. DDD领域驱动设计初探(六):领域服务

    前言:之前一直在搭建项目架构的代码,有点偏离我们的主题(DDD)了,这篇我们继续来聊聊DDD里面另一个比较重要的知识点:领域服务.关于领域服务的使用,书中也介绍得比较晦涩,在此就根据博主自己的理解谈谈 ...

  2. [CF1208D] Restore Permutation

    传送门 题意:有一个长为\(n\)的排列\(p\),设\(S_i=\sum_{j=1}^{i-1}p_j\cdot[p_j<p_i]\),给出\(S\),要求还原出\(p\).保证有解,\(n\ ...

  3. DUBBO原理、应用与面经总结

    研读dubbo源码已经有一段时间了,dubbo中有非常多优秀的设计模式和示例代码值得学习,但是dubbo的调用层级和方法链都较为繁杂,如果不对源码思路进行梳理则很容易忘却,因此总结一篇研读心得,从阅读 ...

  4. 详解Spring MVC 集成EHCache缓存_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 废话少说,直接上代码: ehcache.xml 文件 <?xml version="1.0" ...

  5. heroinfo_set.all 函数

    如果是 一对多 关系 即使用 heroinfo_set.all  此时关联字段类型通用,即上边的字段通用,但是需要添加many=True的参数heroinfo_set = serializers.Pr ...

  6. Vuex-全局状态管理【传递参数】

    src根目录 新建store文件夹,新建index.js 作为入口 在store文件夹中 新建modules文件夹 modules文件夹中,新建 a.js b.js 2个文件 a.js const s ...

  7. CDMA与OFDM之技术比较

    频谱利用率.支持高速率多媒体服务.系统容量.抗多径信道干扰等因素是目前大多数固定宽带无线接入设备商在选择CDMA(码分多址)或OFDM(正交 频分复用)作为点到多点(PMP)的关键技术时的主要出发点. ...

  8. string matching

    string matching exkmp #include<bits/stdc++.h> using namespace std; ; int Nex[maxn],extend[maxn ...

  9. border、outline、boxshadow那些事

    border 边框是我们美化网页.增强样式最常用的手段之一.例如: <div class="text"></div> .text { width: 254p ...

  10. [CSP-S模拟测试]:玩具(概率DP)

    题目描述 这个故事发生在很久以前,在$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$都还在上幼儿园的时候. $IcePrince\text{_}196 ...