HDU 1540 Tunnel Warfare(经典)(区间合并)【线段树】
<题目链接>
题目大意:
一个长度为n的线段,下面m个操作
D x 表示将单元x毁掉
R 表示修复最后毁坏的那个单元
Q x 询问这个单元以及它周围有多少个连续的单元,如果它本身已经被毁坏了就是0。
解题分析:
用线段树求指定点所在的最长连续区间,属于线段树区间合并类型的题,线段树的每个节点需要维护三个值,分别是对应区间的最长连续区间长度,对应区间最长连续区间前缀,对应区间最长连续后缀,然后就是在每次update之后都维护一下这三个值就行。并且注意一下query 时的操作。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
const int N=+;
int len[N<<],llen[N<<],rlen[N<<];
int n,m; void Pushup(int rt,int length){ //更新维护每个节点的三个值
llen[rt]=llen[rt<<]; //首先当前节点的最长连续前缀==左子节点的最长连续前缀
rlen[rt]=rlen[rt<<|];
/*-- 进一步更新 --*/
if(llen[rt<<]==(length-(length>>)))llen[rt]+=llen[rt<<|]; //如果左子节点的最长连续前缀为整个左子区间,那么本节点的前缀还要加上右子区间的最长前缀
if(rlen[rt<<|]==(length>>))rlen[rt]+=rlen[rt<<]; //同理
/*-- 最终更新本节点的最长连续长度 --*/
len[rt]=max(max(len[rt<<],len[rt<<|]),rlen[rt<<]+llen[rt<<|]);
} void build(int rt,int l,int r){
if(l==r){
len[rt]=llen[rt]=rlen[rt]=;
return;
}
int mid=(l+r)>>;
build(Lson);
build(Rson);
Pushup(rt,r-l+);
} void update(int rt,int l,int r,int loc,int c){ //单点更新
if(l==r){
len[rt]=llen[rt]=rlen[rt]=c;
return;
}
int mid=(l+r)>>;
if(loc<=mid)update(Lson,loc,c);
if(loc>mid)update(Rson,loc,c);
Pushup(rt,r-l+);
} int query(int rt,int l,int r,int loc){
if(l==r)return len[rt];
int mid=(l+r)>>;
if(loc<=mid){
if(loc+rlen[rt<<]>mid)return rlen[rt<<]+llen[rt<<|]; //如果loc在左子区间的最长后缀和右子区间的最长前缀中,直接输出这两个前后缀之和即可
else return query(Lson,loc); //否则的话,继续向左子节点查询
}
else{
if(mid+llen[rt<<|]>=loc)return rlen[rt<<]+llen[rt<<|];//因为右子区间是(mid,r]左开区间,所以这里判断loc是否在右子区间的前缀的范围内用的是 ">="
else return query(Rson,loc);
}
} int main(){
while(scanf("%d %d",&n,&m)!=EOF){
build(,,n);
int tot=,stk[N+]; //stk模拟栈
while(m--){
char str[];
scanf("%s",str);
if(str[]=='D'){
int cal;scanf("%d",&cal);
stk[++tot]=cal;
update(,,n,cal,);
}
else if(str[]=='R'){
int cal=stk[tot--];
update(,,n,cal,);
}
else{
int cal;scanf("%d",&cal);
printf("%d\n",query(,,n,cal));
}
}
}
return ;
}
2018-09-23
HDU 1540 Tunnel Warfare(经典)(区间合并)【线段树】的更多相关文章
- HDU 1540 Tunnel Warfare(最长连续区间 基础)
校赛,还有什么途径可以申请加入ACM校队? Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
Tunnel Warfare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 1540 Tunnel Warfare(线段树+区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目大意:抗日战争期间进行地道战,存在n个村庄用地道连接,输入D表示破坏某个村庄(摧毁与其相连的地道, 包 ...
- HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- hdu 1540 Tunnel Warfare (线段树 区间合并)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU - 1540 Tunnel Warfare(线段树区间合并)
https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...
- hdu 1540 Tunnel Warfare 线段数区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) P ...
随机推荐
- log4net使用的两种方式
1.首先添加log4net.dll引用(可以使用 管理NuGet程序包添加引用,也可以下载下来手动去添加引用) 2.在app.config文件中配置 3.log4net使用的2终方式 log4net ...
- Oracle 系统调优
一:前言 一:调整初始化参数 1: Oracle 初始化参数分类 2:主要系统调优参数介绍 二:系统全局区 sga 优化 1:调整内存分配 2:调整日志缓冲区 1:查询当前oracle 实例的日志缓冲 ...
- 用ngif 多次判断 Expression has changed after it was checked
昨天遇到一个问题 ,用ng Expression has changed after it was checked 查了一下说在angular2中,这个错误只会在dev开发模式下出现,在pro发布版本 ...
- gnuradio 初次使用
参考链接: 入门 http://www.cnblogs.com/moon1992/p/5739027.html 创建模块 http://www.cnblogs.com/moon1992/p/54246 ...
- Metasploit框架问题
1.使用nmap 扫描SMB服务漏洞信息 nmap -P0 --script=smb-check-vulns 10.10.15.123 2.sql语句绕过后台 这部分我待会补充 只有尽可能的过滤,没有 ...
- django----Form实时更新两种方式
在ModelForm需要知道: from app03 import models from django.forms import ModelForm class UserForm(ModelForm ...
- 雅礼 noip2018 模拟赛 day3 T3
典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...
- binlog2sql之MySQL数据闪回实践
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...
- Allegro PCB Design GXL (legacy) 手动更改元器件引脚的网络
Allegro PCB Design GXL (legacy) version 16.6-2015 1.菜单:Setup > User Preferences... 2.User Prefere ...
- springboot拦截器HandlerInterceptor详解
Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器). HandlerInterceptor 的功能跟过滤器类似,但 ...