hdu1540 Tunnel Warfare
题目大意给你一个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相关推荐
- HDU-1540 Tunnel Warfare 线段树最大连续区间 或 STL巧解
题目大意 n个点,m个操作(1<=n,m<=5e4),m行中每行一个字符c表示操作类型,一个整型数x表示第x个点 D x 表示去掉第x点,Q x表示需输出含 x 的最大连续区间的长度,R ...
- HDU 1540 Tunnel Warfare
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 解题思路:线段树节点增加一个ld----区间左端点起始的最大长度,rd----区间右端点起始的最 ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- H - Tunnel Warfare HDU - 1540
H - Tunnel Warfare HDU - 1540 题意: n个数顺序排列,左右数相连, 现在有三个操作: 1.摧毁一个位置上的数 2.回复上一次摧毁的数 3.查询包含该位置的最长连续区间长度 ...
- 【HDU - 1540】 Tunnel Warfare (线段树进阶操作 区间合并+ 单点更新+ 最长覆盖区间查询 )
题干: During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the va ...
- hdu 1540 Tunnel Warfare(线段树区间合并)
hdu 1540 Tunnel Warfare 记录每个节点的最大左连续值.最大右连续值.最大连续值,向上更新的是常规的区间合并处理方式 关键是想到如何去查询,如果查询节点落在左儿子节点的右连续段中, ...
- Tunnel Warfare(HDU1540+线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...
- HDOJ1540 - Tunnel Warfare 线段树区间合并
HDOJ 1540 题目大意:给定两个整数N,M, 其中N表示一共有N个村庄,M代表有M次操作,操作有以下: 1. D x 销毁村庄x 2. Q x 询问与村庄x相邻的村庄总数 3. ...
- poj 2892 Tunnel Warfare
http://poj.org/problem?id=2892 此代码在POJ上能过 在hdu上过不了 题目大意: n个村庄相连 三种操作 D 摧毁一个村庄 Q 查询包括此村庄在内和此村庄直接和间接相 ...
最新文章
- jacoco收集探针结果时机_滴滴开源Super-jacoco:java代码覆盖率收集平台
- spring boot configuration annotation processor not found in classpath问题解决
- python闪光培训班 费用-Python tk 按钮颜色
- web前端 如何入门人工智能算法
- 天天酷跑php源码_使用Java实现天天酷跑(附源码)
- CUDA精进之路(二):图像处理——形态学滤波(膨胀、腐蚀、开闭运算)
- 二维特征分类的基础_3D 分割分类总结
- Silverlight Quick Starts翻译(二):第一章 创建一个Silverlight工程
- C#进行注册表项和键值操作
- 思科路由器配置命令(详细命令总结归纳)
- https://download.csdn.net/download/kuyu27537830/1322930#comment
- npm install报错ERR code ETIMEDOUT的解决办法
- 两年数据对比柱形图_【Excel技巧】制作柱形图图表完美呈现百分比,提升您的报表颜值...
- php实现wav转mp3,求,用PHP实现MP3转WAV后生成波形图的方法
- 下载分享永不关机 几步玩转家庭NAS组建
- 计算机软件系统技术,信息技术《计算机软件系统》教学设计
- 超多趣味测评测试微信小程序源码 可插入流量主广告位
- Vue3 - filters 过滤器为什么被移除放弃?取而代之的解决方案又是什么?
- 如何使用开源CMS建设网站
- Android简易微信界面