题目大意给你一个01串就是求每个点的最长连续值为1的区间的长度,我们可以将村庄抽象成一个点,正常下值为1,被破坏后变成0,即可将题目抽象成一个求目标节点所在的最长连续1序列的区间的长度。

这题用的是线段树区间合并的方法。对每个区间我们维护5个值l,r,lsum表示从区间的l开始的连续1的长度,rsum相同,msum表示l到r区间最长的连续1的长度。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn=500005;
#define ls i<<1
#define rs (i<<1)|1
struct node
{int l,r;int lsum,rsum,msum;
}tree[maxn<<2];
int istack[maxn],top=0;
void pushup(int i)
{tree[i].lsum=tree[ls].lsum;tree[i].rsum=tree[rs].rsum;if(tree[i].lsum==(tree[ls].r-tree[ls].l+1))tree[i].lsum+=tree[rs].lsum;if(tree[i].rsum==(tree[rs].r-tree[rs].l+1))tree[i].rsum+=tree[ls].rsum;tree[i].msum=max(max(tree[ls].rsum+tree[rs].lsum,tree[i].lsum),tree[i].rsum);
}
void build(int i,int l,int r)
{tree[i].l=l;tree[i].r=r;if(l==r){tree[i].lsum=tree[i].rsum=tree[i].msum=1;return ;}int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);pushup(i);
}
void update(int i,int op,int pos)
{if(tree[i].l==tree[i].r){tree[i].lsum=tree[i].rsum=tree[i].msum=op;return ;}int mid=(tree[i].l+tree[i].r)>>1;if(pos<=mid)update(ls,op,pos);elseupdate(rs,op,pos);pushup(i);
}
int query(int i,int pos)
{if((tree[i].l==tree[i].r)||(tree[i].msum==(tree[i].r-tree[i].l+1))||(tree[i].msum==0)) return tree[i].msum;int mid = (tree[i].l+tree[i].r)>>1;if(pos<=mid)//满足则在左儿子找{if(pos>=(tree[ls].r-tree[ls].rsum+1))return query(ls,pos)+query(rs,mid+1);elsereturn query(ls,pos);}elseif(pos<=(tree[rs].lsum+tree[rs].l-1))return query(rs,pos)+query(ls,mid);elsereturn query(rs,pos);
}int main()
{int n,m;while(scanf("%d%d",&n,&m)!=EOF){build(1,1,n);//cout<<"***************"<<endl;//cout<<"l r lsum rsum msum"<<endl;//for(int i=1;i<=7;i++)//cout<<i<<"节点的值"<<tree[i].l<<" "<<tree[i].r<<" "<<tree[i].lsum<<" "<<tree[i].rsum<<" "<<tree[i].msum<<endl;int pos;char ch[10];while(m--){scanf("%s",ch);if(ch[0]=='D'){scanf("%d",&pos);istack[++top]=pos;update(1,0,pos);//cout<<"***************"<<endl;//cout<<"l r lsum rsum msum"<<endl;//for(int i=1;i<=7;i++)//cout<<i<<"节点的值"<<tree[i].l<<" "<<tree[i].r<<" "<<tree[i].lsum<<" "<<tree[i].rsum<<" "<<tree[i].msum<<endl;}elseif(ch[0]=='R'){if(!top) continue;pos=istack[top--];update(1,1,pos);}else{scanf("%d",&pos);printf("%d\n",query(1,pos));}}}return 0;
}

hdu1540 Tunnel Warfare相关推荐

  1. HDU-1540 Tunnel Warfare 线段树最大连续区间 或 STL巧解

    题目大意 n个点,m个操作(1<=n,m<=5e4),m行中每行一个字符c表示操作类型,一个整型数x表示第x个点 D x 表示去掉第x点,Q x表示需输出含 x 的最大连续区间的长度,R ...

  2. HDU 1540 Tunnel Warfare

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 解题思路:线段树节点增加一个ld----区间左端点起始的最大长度,rd----区间右端点起始的最 ...

  3. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  4. H - Tunnel Warfare HDU - 1540

    H - Tunnel Warfare HDU - 1540 题意: n个数顺序排列,左右数相连, 现在有三个操作: 1.摧毁一个位置上的数 2.回复上一次摧毁的数 3.查询包含该位置的最长连续区间长度 ...

  5. 【HDU - 1540】 Tunnel Warfare (线段树进阶操作 区间合并+ 单点更新+ 最长覆盖区间查询 )

    题干: During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the va ...

  6. hdu 1540 Tunnel Warfare(线段树区间合并)

    hdu 1540 Tunnel Warfare 记录每个节点的最大左连续值.最大右连续值.最大连续值,向上更新的是常规的区间合并处理方式 关键是想到如何去查询,如果查询节点落在左儿子节点的右连续段中, ...

  7. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  8. HDOJ1540 - Tunnel Warfare 线段树区间合并

    HDOJ 1540 题目大意:给定两个整数N,M, 其中N表示一共有N个村庄,M代表有M次操作,操作有以下: 1.    D x  销毁村庄x 2.    Q x  询问与村庄x相邻的村庄总数 3.  ...

  9. poj 2892 Tunnel Warfare

    http://poj.org/problem?id=2892 此代码在POJ上能过 在hdu上过不了 题目大意: n个村庄相连  三种操作 D 摧毁一个村庄 Q 查询包括此村庄在内和此村庄直接和间接相 ...

最新文章

  1. jacoco收集探针结果时机_滴滴开源Super-jacoco:java代码覆盖率收集平台
  2. spring boot configuration annotation processor not found in classpath问题解决
  3. python闪光培训班 费用-Python tk 按钮颜色
  4. web前端 如何入门人工智能算法
  5. 天天酷跑php源码_使用Java实现天天酷跑(附源码)
  6. CUDA精进之路(二):图像处理——形态学滤波(膨胀、腐蚀、开闭运算)
  7. 二维特征分类的基础_3D 分割分类总结
  8. Silverlight Quick Starts翻译(二):第一章 创建一个Silverlight工程
  9. C#进行注册表项和键值操作
  10. 思科路由器配置命令(详细命令总结归纳)
  11. https://download.csdn.net/download/kuyu27537830/1322930#comment
  12. npm install报错ERR code ETIMEDOUT的解决办法
  13. 两年数据对比柱形图_【Excel技巧】制作柱形图图表完美呈现百分比,提升您的报表颜值...
  14. php实现wav转mp3,求,用PHP实现MP3转WAV后生成波形图的方法
  15. 下载分享永不关机 几步玩转家庭NAS组建
  16. 计算机软件系统技术,信息技术《计算机软件系统》教学设计
  17. 超多趣味测评测试微信小程序源码 可插入流量主广告位
  18. Vue3 - filters 过滤器为什么被移除放弃?取而代之的解决方案又是什么?
  19. 如何使用开源CMS建设网站
  20. Android简易微信界面

热门文章

  1. 毕业生社保、档案和户口详解 1
  2. unityplayerpre存档_Unity3d中的PlayerPrefs游戏存档API的扩展
  3. 一物一码二维码红包系统介绍
  4. linux驱动程序设计21 Linux设备驱动的调试
  5. 查看Oracle数据库命中率
  6. android qq账号登陆验证手机号码,注册QQ号如何跳过手机验证
  7. Linux部署redis以及部署完成后,远程工具连接不上问题
  8. 一木禾网盘下载分析及批量获取下载地址的实现(下)
  9. 解决linux上耳机没有声音
  10. Java的wait()、notify()学习三部曲之一:JVM源码分析