Tunnel Warfare
hdu1540:http://acm.hdu.edu.cn/showproblem.php?pid=1540
题意:给你一列村庄,每个村庄给一个标号,1--n,然后毁掉一些村庄,或者重建几个村庄,重建是按照毁掉的反序建的,也就是说,最新建的是最后毁掉的那个村庄。在这些过程中会有一些查询,查询pos这个村庄所在的最长的连续村庄的个数。
题解:很容易想到用线段树来维护,维护区间的最大左连续和最大右连续值,毁掉就是单点更新操作,同时把毁掉的村庄一次放入队列中,重建的时候只要从队列中取出即可。唯一难的是查询操作。一开始,我没有想到如何查询。最后只好查询了别人的代码。分几种情况, 如果pos在该区间的左连续或者右连续中,直接返回左连续或者右连续的值。如果不在,则需要判断是否在左儿子里面。若在左儿子里面,则需要判断是否在左儿子的右连续中如果在,则需要以右儿子的左端点为查询对象在右子树中 查询,然后把左儿子和右儿子的查询结果
相加,返回。如果pos在右儿子,同理。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
struct Node{
int left,right;
int lsum,rsum;
}node[<<];
int ans[];
int top;
int n,m;
void build(int l,int r,int idx){//普通的建树
node[idx].left=l;
node[idx].right=r;
if(l==r){
node[idx].lsum=node[idx].rsum=;
return;
}
int mid=(l+r)/;
build(l,mid,idx<<);
build(mid+,r,idx<<|);
node[idx].lsum=node[idx].rsum=r-l+;
}
void pushup(int idx){//区间左连续和右连续的维护
if(node[idx<<].lsum==node[idx<<].right-node[idx<<].left+)//左连续的处理
node[idx].lsum=node[idx<<].lsum+node[idx<<|].lsum;
else
node[idx].lsum=node[idx<<].lsum;
if(node[idx<<|].rsum==node[idx<<|].right-node[idx<<|].left+)//右连续的处理
node[idx].rsum=node[idx<<].rsum+node[idx<<|].rsum;
else
node[idx].rsum=node[idx<<|].rsum;
}
void update(int pos,int val,int idx){//单点更新
if(node[idx].left==node[idx].right){
node[idx].lsum=node[idx].rsum=val;
return;
}
int mid=(node[idx].left+node[idx].right)/;
if(mid>=pos)update(pos,val,idx<<);
else update(pos,val,idx<<|);
pushup(idx);
}
int query(int pos,int idx){//查询,分情况讨论
if(pos<=node[idx].left+node[idx].lsum-)
return node[idx].lsum;
if(pos>=node[idx].right-node[idx].rsum+)//这里无法保证pos一定在叶子节点的左连续或者右连续中,因为该村庄可能已经被毁
return node[idx].rsum;
//printf("%d\n",node[idx].left);
if(node[idx].left==node[idx].right)return node[idx].lsum;//到达叶子节点时候要返回,因为上面的条件无法保证
int mid=(node[idx].left+node[idx].right)/;
if(mid>=pos){
if(pos>=node[idx<<].right-node[idx<<].rsum+)
return query(pos,idx<<)+query(node[idx<<|].left,idx<<|);
else
return query(pos,idx<<);
}
else {
if(pos<=node[idx<<|].lsum+node[idx<<|].left-)
return query(pos,idx<<|)+query(node[idx<<].right,idx<<);
else
return query(pos,idx<<|);
}
}
int main(){
char temp;int data;
while(~scanf("%d%d",&n,&m)){
top=-;
build(,n,);
while(m--){
cin>>temp;
if(temp=='D'){
cin>>data;
ans[++top]=data;
update(data,,);
}
else if(temp=='R'){
int tt=ans[top--];
update(tt,,);
}
else{
cin>>data;
printf("%d\n",query(data,));
}
}
}
}
Tunnel Warfare的更多相关文章
- hdu1540 Tunnel Warfare
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- [POJ2892]Tunnel Warfare
[POJ2892]Tunnel Warfare 试题描述 During the War of Resistance Against Japan, tunnel warfare was carried ...
- HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- poj 2892 Tunnel Warfare(线段树)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7499 Accepted: 3096 D ...
- 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(线段树区间统计)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU 1540 Tunnel Warfare(最长连续区间 基础)
校赛,还有什么途径可以申请加入ACM校队? Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/ ...
随机推荐
- 屏蔽全部统计代码(51.la cnzz 百度统计 谷歌分析师adsense、屏蔽淘宝客广告代码)的方法
支持百度统计 .51.la统计.cnzz统计.51yes统计.谷歌分析师.阿里妈妈淘宝客广告.chinaz弹窗.假设有很多其它的须要屏蔽的,欢迎联系 default7#zbphp.com 改动etc的 ...
- Codeforces 15B Laser
题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<se ...
- JAVA操作Excel时文字自适应单元格的宽度设置方法
使用JAVA操作Excel通常都使用JXL,方法很简单网上也有很多的教程,然后往往一些细节性的问题却导致我们这些Programmer苦恼不已.这两天帮一个朋友做一个Excel表格自动生成的小软件,就遇 ...
- activeMQ数据消耗,但在该站的中间,但是没有理由删除数据
connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); 第一参数改变时TRUE后,消费数据将出现在MQ中间站没有记录删除. ...
- Android 颜色渲染(九) PorterDuff及Xfermode详解
版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色渲染(九) PorterDuff及Xfermode详解 之前已经讲过了除ComposeShader之外Shader的全部子类 ...
- Eclipse启动 报错[Failed to load the JNI shared library jvm.dll
准备要做java服务器,在安装开发环境时,启动Eclipse报错[Failed to load the JNI shared library jvm.dll] 研究了下,造成错误的原因是由于eclip ...
- 什么是JPA
起源 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分.但它不囿于EJB 3.0,你可以在Web应用.甚至桌面应用中使用.JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过 ...
- PHP 的try catch 报错捕获机制
首先上代码: try { echo 'Never executed'; echo "<br>"; if(1<0){ echo 'end'; }else{ thro ...
- EF Lambda 多表查询
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...
- Android ListView 嵌套 ImageView,如何响应ImageView的点击和长按事件
http://www.tuicool.com/articles/EZv2Uv 1.先说下嵌套在ListView中的ImageView如何响应点击事件 方法:在imageView中设置onClick属性 ...