Tunnel Warfare--- hdu1540 线段树求连续子区间
题意:有n个村庄,编号分别为1-n;由于战争会破坏村庄,但是我们也会修复;
D x代表村庄x被破坏;
Q x是求与x相连的有几个没有被破坏;
R 是修复最后一次被破坏的村庄;
接下来有m个操作,对于每次Q操作输出结果;
由于修复的是最后一次被破坏的所以要用stack
接下来看代码吧,加个图好理解一点
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std; #define INF 0xfffffff
#define N 50050
#define Lson r<<1
#define Rson r<<1|1 struct SegmentTree
{
int L, R, sum, lsum, rsum; int Mid() { return (L+R)>>;}
int len() { return R-L+; } } a[N<<]; void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R;
a[r].sum = a[r].lsum = a[r].rsum = a[r].len();///刚开始的时候一定是区间所在长度;
if(L == R) return;
Build(Lson, L, a[r].Mid());
Build(Rson, a[r].Mid()+, R);
} void Up(int r)///当下面的节点发生变化的时候我们要往上不断更新
{
a[r].lsum = a[Lson].lsum;
a[r].rsum = a[Rson].rsum; if(a[r].lsum == a[Lson].len())
a[r].lsum += a[Rson].lsum;
if(a[r].rsum == a[Rson].len())
a[r].rsum += a[Lson].rsum; a[r].sum = max(max(a[Lson].lsum, a[Rson].rsum),a[Lson].rsum+a[Rson].lsum);
} void Update(int r, int pos, int flag)///flag 为0表示破坏,1表示修复;
{///因为是直接更新到叶子节点的所以不需再往下更新,但是要往上更新;
if(a[r].L == a[r].R && a[r].L==pos)
{
a[r].sum = a[r].lsum = a[r].rsum = flag;
return ;
} if(pos <= a[r].Mid())
Update(Lson, pos, flag);
else if(pos > a[r].Mid())
Update(Rson, pos, flag); Up(r);
} int Query(int r, int pos)
{
if(a[r].sum == )return ; if(pos < a[r].L + a[r].lsum) return a[r].lsum;///在最左边
if(pos > a[r].R - a[r].rsum) return a[r].rsum;///在最右边 if(pos > a[Lson].R - a[Lson].rsum && pos < a[Rson].L + a[Rson].lsum )///在中间部分;
return a[Lson].rsum + a[Rson].lsum; if(pos <= a[r].Mid()) return Query(Lson, pos);///在左半边而非最左边;
else return Query(Rson, pos);///在右半边而非最右边;
} int main()
{
int n, m, x;
char s[];
while(scanf("%d %d", &n, &m)!=EOF)
{
Build(, , n);
stack<int> sta;
for(int i=; i<=m; i++)
{
scanf("%s", s);
if(s[] == 'D')
{
scanf("%d", &x);
Update(, x, );
sta.push(x);///按破坏顺序一个一个的加入栈中
}
else if(s[] == 'Q')
{
scanf("%d", &x);
printf("%d\n", Query(, x));
}
else
{
x = sta.top();
sta.pop();
Update(, x, );
}
}
}
return ;
}
Tunnel Warfare--- hdu1540 线段树求连续子区间的更多相关文章
- HDU1540 Tunnel Warfare(线段树区间维护&求最长连续区间)题解
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU--1540 Tunnel Warfare(线段树区间更新)
题目链接:1540 Tunnel Warfare 以为单组输入 这个题多组输入 结构体记录每个区间左边和右边的连续区间 ms记录最大 在查询操作时: 1.这个点即将查询到右区间 看这个点 x 是否存在 ...
- hdu1540 Tunnel Warfare【线段树】
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】
Tunnel Warfare Time Limit: 4000/2000 MS ...
- 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(线段树区间合并)
https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...
随机推荐
- python virtualenv安装说明
环境说明: virtualenv安装: 第一步,创建目录code: 第二步,创建一个独立的Python运行环境,命名为venv: 新建的Python环境被放到当前目录下的venv目录. 第三步,有了v ...
- Git服务器的搭建和使用
一.GIT服务器的搭建 1. 安装Git yum -y install git 2. 创建git用户 adduser git 3. 创建证书登陆 收集所有客户端需要登录的用户的公钥,就是他们自己的 ...
- ASP.NET MVC入门到精通——数据库仓储
业务层调用数据层对象,我不想每次都new一个数据层对象,而是在数据层创建一个仓储,统一管理所有的对象调用. 1.在IDAL项目中,新建IDBSession.tt模板 Ctrl+S后自动生成IDBS ...
- MQ java 基础编程(一)
本文转自:http://www.blogjava.net/i369/articles/88035.html 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gm ...
- AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群
转自:http://www.open-open.com/lib/view/open1389880948758.html 引言: 如今redis凭借其高性能的优势, 以及丰富的数据结构作为 ...
- 学习下新塘M0芯片的下载方法
编程方式多种多样,解释这几种方式的原理,方便做后续的回答: 一.脱机 脱机的意思就是脱离PC机,有很多芯片必须连接PC才能烧录,比如某些FPGA芯片.MCU芯片.NAND Flash芯片等.脱机和在线 ...
- 《Lua程序设计》第1章 开始 学习笔记
1.1 程序块(chunk)每段代码(例如一个源代码文件或在交互模式中输入的一行代码),称为一个程序块.若使用命令行参数-i来启动Lua解释器,那么解释器就会在运行完指定程序块后进入交互模式.dofi ...
- Java枚举根据key获取value
package com.utcip.crm.common.constants; import com.utcip.crm.common.base.process.ScheduleStatusEnum; ...
- 中间件系列三 RabbitMQ之交换机的四种类型和属性
概述本文介绍RabbitMQ中交换机类型和属性,主要内容如下: 交换机的作用交换机的类型:Direct exchange(直连交换机).Fanout exchange(扇型交换机).Topic exc ...
- 【JSON.NET】json序列化小驼峰格式(属性名首字母小写)
废话少说,先上代码 var setting = new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serializ ...