题目链接 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. 在Docker中部署Spring Boot项目

    想要获取更多文章可以访问我的博客 - 代码无止境. 微服务现在在互联网公司可谓非常流行了,之前找工作的的时候很多HR电话约面试的时候都会问对微服务是否有过接触.而微服务和Docker可以非常完美的结合 ...

  2. Maven项目的打包发布到Nexus私服和服务器

    1.编写pom文件如下: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...

  3. Spring注解浅入浅出——不吹牛逼不装逼

    Spring注解浅入浅出——不吹牛逼不装逼 前情提要 上文书咱们说了<Spring浅入浅出>,对Spring的核心思想看过上篇的朋友应该已经掌握了,此篇用上篇铺垫,引入注解,继续深入学习. ...

  4. 夯实Java基础(三)——面向对象之继承

    1.继承概述 继承是Java面向对象的三大特征之一,是比较重要的一部分,与后面的多态有着直接的关系.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法, ...

  5. linux环境下搭建自动化Jenkins管理工具

    一.搭建一个jak--tomcat服务器到自己的linux服务器上 具体的服务器搭建这里可以参考华华大佬的博客:https://www.cnblogs.com/liulinghua90/p/46614 ...

  6. java并发编程(十二)----(JUC原子类)数组类型介绍

    上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray.其中前两个的使用方 ...

  7. Meta 用法汇总

    本文引自: http://blog.csdn.net/MR_LP/article/details/53607087 什么是 meta ? meta 是html语言head区的一个辅助性标签.也许你认为 ...

  8. JVM调优之经验

    在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁.一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来 ...

  9. 昂贵的聘礼 POJ - 1062

    题目链接:https://vjudge.net/problem/POJ-1062 如图,我们可以把交换的情况,抽象为一个有向图, 先抛去等级限制,那么就是一个最短路,从①出发,到达其他点的最短路中 最 ...

  10. Kafka 系列(四)—— Kafka 消费者详解

    一.消费者和消费者群组 在 Kafka 中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka 之所以要引入消费者群组这个概念是因为 Kafka 消费者经 ...