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的更多相关文章

  1. hdu1540 Tunnel Warfare

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. [POJ2892]Tunnel Warfare

    [POJ2892]Tunnel Warfare 试题描述 During the War of Resistance Against Japan, tunnel warfare was carried ...

  3. HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并

    Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Lim ...

  4. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7876   Accepted: 3259 D ...

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

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

  6. hdu 1540 Tunnel Warfare (区间线段树(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...

  7. poj 2892 Tunnel Warfare(线段树)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7499   Accepted: 3096 D ...

  8. HDU-1540          Tunnel Warfare

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. hdu 1540 Tunnel Warfare(线段树区间统计)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  10. HDU 1540 Tunnel Warfare(最长连续区间 基础)

    校赛,还有什么途径可以申请加入ACM校队?  Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/ ...

随机推荐

  1. 屏蔽全部统计代码(51.la cnzz 百度统计 谷歌分析师adsense、屏蔽淘宝客广告代码)的方法

    支持百度统计 .51.la统计.cnzz统计.51yes统计.谷歌分析师.阿里妈妈淘宝客广告.chinaz弹窗.假设有很多其它的须要屏蔽的,欢迎联系 default7#zbphp.com 改动etc的 ...

  2. Codeforces 15B Laser

    题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<se ...

  3. JAVA操作Excel时文字自适应单元格的宽度设置方法

    使用JAVA操作Excel通常都使用JXL,方法很简单网上也有很多的教程,然后往往一些细节性的问题却导致我们这些Programmer苦恼不已.这两天帮一个朋友做一个Excel表格自动生成的小软件,就遇 ...

  4. activeMQ数据消耗,但在该站的中间,但是没有理由删除数据

    connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); 第一参数改变时TRUE后,消费数据将出现在MQ中间站没有记录删除. ...

  5. Android 颜色渲染(九) PorterDuff及Xfermode详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色渲染(九)  PorterDuff及Xfermode详解 之前已经讲过了除ComposeShader之外Shader的全部子类 ...

  6. Eclipse启动 报错[Failed to load the JNI shared library jvm.dll

    准备要做java服务器,在安装开发环境时,启动Eclipse报错[Failed to load the JNI shared library jvm.dll] 研究了下,造成错误的原因是由于eclip ...

  7. 什么是JPA

    起源 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分.但它不囿于EJB 3.0,你可以在Web应用.甚至桌面应用中使用.JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过 ...

  8. PHP 的try catch 报错捕获机制

    首先上代码: try { echo 'Never executed'; echo "<br>"; if(1<0){ echo 'end'; }else{ thro ...

  9. EF Lambda 多表查询

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...

  10. Android ListView 嵌套 ImageView,如何响应ImageView的点击和长按事件

    http://www.tuicool.com/articles/EZv2Uv 1.先说下嵌套在ListView中的ImageView如何响应点击事件 方法:在imageView中设置onClick属性 ...