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;
}

最新文章

  1. PHP开源论坛PunBB在IIS上部署和安装
  2. 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法
  3. tomcat下的https项目创建与部署
  4. Wireshark抓包分析HTTPS与HTTP报文的差异
  5. nmap命令-----高级用法
  6. robotframework-FQA
  7. asp.net mvc3 数据验证(四)—Remote验证的一个注意事项
  8. ok6410 u-boot-2012.04.01移植二修改源码支持单板
  9. USB LPT 端口映射
  10. UIWebView &amp; javascript
  11. HDU - 1160 FatMouse&#39;s Speed 动态规划LIS,路径还原与nlogn优化
  12. 批量拼脚本神器-NimbleText
  13. Python字典猜解
  14. Linux服务器部署系列之三—DNS篇
  15. node.js中的匿名函数, 回调函数和嵌套函数
  16. hadoop,hbase,hive安装全记录(转)
  17. [Eclipse]Eclipse快捷键
  18. 【[SCOI2010]股票交易】
  19. Java 扫描器类 Scanner类
  20. LeetCode215. 数组中的第K个最大元素

热门文章

  1. Spring源码--Bean的管理总结(一)
  2. python数据探索与数据与清洗概述
  3. lambda匿名函数sorted排序函数filter过滤函数map映射函数
  4. LeetCode--064--最小路径和
  5. iOS - 图片的显示模式
  6. 8:Spring Boot Shiro记住密码
  7. 阿里云服务器不能使用apt-get
  8. Docker在CentOS7中的安装与启动
  9. CF1081G Mergesort Strikes Back
  10. 170815-关于Session知识点