题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1540

题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少。

其实这题直接二分查找也可以,但用线段树可以练一练手。

大致思路就是找查询点最近的左右两个0的位置(0表示被摧毁的),然后输出区间大小即可,如果这个点已经被摧毁那么就没有

连续的区间,那么输出0。线段树查询位置有点麻烦具体看代码。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
const int M = 5e4 + 10;
struct TnT {
int l , r , num;
}T[M << 2];
int n , m;
void build(int l , int r , int p) {
int mid = (l + r) >> 1;
T[p].l = l , T[p].r = r;
if(T[p].l == T[p].r) {
T[p].num = 1;
return;
}
build(l , mid , p << 1);
build(mid + 1 , r , (p << 1) | 1);
T[p].num = T[p << 1].num + T[(p << 1) | 1].num;
}
void updata(int pos , int p , int ad) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == T[p].r && T[p].l == pos) {
T[p].num = ad;
return ;
}
if(mid >= pos) {
updata(pos , p << 1 , ad);
}
else {
updata(pos , (p << 1) | 1 , ad);
}
T[p].num = T[p << 1].num + T[(p << 1) | 1].num;
}
int queryr(int p , int l , int r) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l >= l && T[p].r <= r) {
if(T[p].l == T[p].r) {
if(T[p].num == 0) {
return T[p].l;
}
else {
return n + 1;
}
}
if(T[p << 1].r - T[p << 1].l + 1 > T[p << 1].num) {
return queryr(p << 1 , l , r);
}
else {
return queryr((p << 1) | 1 , l , r);
}
}
if(mid >= r) {
return queryr(p << 1 , l , r);
}
else if(mid < l) {
return queryr((p << 1) | 1 , l , r);
}
else {
return min(queryr(p << 1 , l , mid) , queryr((p << 1) | 1 , mid + 1 , r));
}
}
int queryl(int p , int l , int r) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l >= l && T[p].r <= r) {
if(T[p].l == T[p].r) {
if(T[p].num == 0) {
return T[p].l;
}
else {
return 0;
}
}
if(T[(p << 1) | 1].r - T[(p << 1) | 1].l + 1 > T[(p << 1) | 1].num) {
return queryl((p << 1) | 1 , l , r);
}
else {
return queryl(p << 1 , l , r);
}
}
if(mid >= r) {
return queryl(p << 1 , l , r);
}
else if(mid < l) {
return queryl((p << 1) | 1 , l , r);
}
else {
return max(queryl(p << 1 , l , mid) , queryl((p << 1) | 1 , mid + 1 , r));
}
}
int query(int p , int pos) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == T[p].r) {
return T[p].num;
}
if(mid >= pos) {
return query(p << 1 , pos);
}
else {
return query((p << 1) | 1 , pos);
}
}
int main() {
while(~scanf("%d%d" , &n , &m)) {
build(1 , n , 1);
char cp[2];
stack<int>ss;
int mm;
for(int i = 0 ; i < m ; i++) {
scanf("%s" , cp);
if(cp[0] == 'D') {
scanf("%d" , &mm);
updata(mm , 1 , 0);
ss.push(mm);
}
if(cp[0] == 'Q') {
scanf("%d" , &mm);
int g = query(1 , mm);
if(g == 0) {
printf("0\n");
continue;
}
int L = queryl(1 , 1 , mm);
int R = queryr(1 , mm , n);
printf("%d\n" , R - L - 1);
}
if(cp[0] == 'R') {
if(!ss.empty()) {
int gl = ss.top();
ss.pop();
updata(gl , 1 , 1);
}
}
}
}
return 0;
}

hdu 1540 Tunnel Warfare(线段树)的更多相关文章

  1. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

    Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

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

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

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

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

  4. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  5. HDU 1540 Tunnel Warfare (线段树)

    题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...

  6. HDU 1540 Tunnel Warfare (线段树或set水过)

    题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...

  7. hdu 1540 Tunnel Warfare 线段树 区间合并

    题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...

  8. hdu 1540 Tunnel Warfare 线段数区间合并

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

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

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

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

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

随机推荐

  1. JavaScript数据结构——集合的实现与应用

    与数学中的集合概念类似,集合由一组无序的元素组成,且集合中的每个元素都是唯一存在的.可以回顾一下中学数学中集合的概念,我们这里所要定义的集合也具有空集(即集合的内容为空).交集.并集.差集.子集的特性 ...

  2. Git 学习笔记之(一) 使用 git gui 从github上下载代码

    背景: 目前一些开源代码均在 GitHub上管理的,包括自己写的代码也可以放在上面进行管理.但问题是,当你换一台电脑,想要将你自己放在 GitHub 上的代码工程下载下来的时候,会遇到各种问题,目前可 ...

  3. 同时运行多个 tomcat 修改端口

    修改 tomcat 配置文件,路径: tomcat_home/conf/server.xml  1.HTTP端口,默认8080,如下改为8081 <Connector connectionTim ...

  4. 使用富文本编辑器Kindeditor

    今天在做需求的时候,遇到有一个字段,需要保存带有格式的内容,决定使用富文本框编辑器Kindeditor来实现,解决方法如下: 登录官网下载控件包: http://kindeditor.net/down ...

  5. Netty学习(七)-Netty编解码技术以及ProtoBuf和Thrift的介绍

    在前几节我们学习过处理粘包和拆包的问题,用到了Netty提供的几个解码器对不同情况的问题进行处理.功能很是强大.我们有没有去想这么强大的功能是如何实现的呢?背后又用到了什么技术?这一节我们就来处理这个 ...

  6. 使用mybatis实现分页查询示例代码分析

    *******************************************分页查询开始*************************************************** ...

  7. SSM框架的详细解说

    文章转载自:http://blog.csdn.net/zhshulin 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就 ...

  8. javaScript今日总结

    javascript简单介绍ECMAScript 1.语法 2.变量:只能使用var定义,如果在函数的内容使用var定义,那么它是一个局部变量,如果没有使用var它是一个全局的.弱类型! 3.数据类型 ...

  9. STL 队列

    头文件 #include <queue> 定义 普通队列: queue < int > q; 优先队列: priority_queue < int, vector< ...

  10. Unity进阶之ET网络游戏开发框架 02-ET的客户端启动流程分析

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...