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 ...
随机推荐
- 信息摘要算法之二:SHA1算法分析及实现
SHA算法,即安全散列算法(Secure Hash Algorithm)是一种与MD5同源的数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛 ...
- Confluence 6 缓存性能示例
有关 Confluence 的缓存性能如何设置,让我们看看下面的表: 缓存(Caches) % 使用的缓存(Used) % 有效率(Effectiveness) 对象/大小(Objects/Size) ...
- clock gen sdk 代码笔记
int ClockConfig(void) { u32 DIVCLK_DIVIDE = 10; u32 CLKFBOUT_MULT = 53; u32 CLKFBOUT_FRAC = 625; u32 ...
- LeetCode(121):买卖股票的最佳时机
Easy! 题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买 ...
- wireless Penetration Testing & Honeypot and Mis-Association attacks
重新记一遍 ,在捕获握手数据包的时候不容易获取,所以使用ARP请求.使用自己的无线网卡的地址发送请求,会容易使得无线开启端掉线,迫使重新连接. 1.使用命令 aireplay-ng -3 -b a ...
- C#关于线程的问题
1.通过System.threading.Thread类可以创建新的线程,并在线程堆栈中运行静态和动态的实例,可以通过Thread类的构造方法传递一个无参数,并且不返回的委托, class Progr ...
- 论文阅读笔记十七:RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation(CVPR2017)
论文源址:https://arxiv.org/abs/1611.06612 tensorflow代码:https://github.com/eragonruan/refinenet-image-seg ...
- JQuery之左侧菜单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Ajax 异步局部刷新
Ajax 异步局部刷新 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页 ...
- WebApi服务以及跨域设置
WCF 它利用TCP.HTTP.MSMQ等传输协议构建“契约先行”的服务.WCF最初为基于SOAP的服务而设计[xml],繁琐.冗余.慢.沉重 WebApi 基于http协议,轻量级的,支持URL路由 ...