HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少
思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区间,左儿子的最大连续右区间+右儿子的最大连续左区间)决定
所以线段树的节点应该维护当前节点的最大连续左区间,最大连续右区间,和最大连续区间。
注意更新的时候,如果左儿子全满,父亲节点的左连续区间还要加上右儿子的左区间。反之同理。
查询的时候,可以剪枝,如果是叶子,或为空,或满,则不用往下查询。
查询的时候还要注意,当前查询点在左儿子的最大右连续区间内时,最大连续区间还要加上右儿子的最大连续区间。反之同理;
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = ;
const int MOD = 1e9+;
#define LL long long
#define mi() (l+r)>>1
double const pi = acos(-);
void fre() {
freopen("in.txt","r",stdin);
}
// inline int r() {
// int x=0,f=1;char ch=getchar();
// while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
// while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f;
// }
int s[N];
struct node {
int l,r;
int ls,rs,ms;
} e[N<<]; void pushup(int rt) { }
void build(int l,int r,int rt) {
e[rt].l=l;
e[rt].r=r;
e[rt].ls=e[rt].rs=e[rt].ms=r-l+;
if(l!=r) {
int mid=mi();
build(lson);
build(rson);
}
} void update(int rt,int c,int x) {
if(e[rt].l==e[rt].r) {
if(x>) {
e[rt].ls=e[rt].rs=e[rt].ms=;
} else
e[rt].ls=e[rt].rs=e[rt].ms=;
return;
}
int mid=(e[rt].l+e[rt].r)>>;
if(c<=mid) {
update(rt<<,c,x);
} else
update(rt<<|,c,x);
e[rt].ls=e[rt<<].ls;
e[rt].rs=e[rt<<|].rs;
e[rt].ms=max(max(e[rt<<].ms,e[rt<<|].ms),e[rt<<].rs+e[rt<<|].ls);
if(e[rt<<].ls==e[rt<<].r-e[rt<<].l+) {
e[rt].ls+=e[rt<<|].ls;
}
if(e[rt<<|].rs==e[rt<<|].r-e[rt<<|].l+) {
e[rt].rs+=e[rt<<].rs;
}
} int query(int rt,int c) {
if(e[rt].l==e[rt].r||e[rt].ms==||e[rt].ms==e[rt].r-e[rt].l+) {
return e[rt].ms;
}
int mid=(e[rt].l+e[rt].r)>>;
if(c<=mid) {
if(c>=e[rt<<].r-e[rt<<].rs+) {
return query(rt<<,c)+query(rt<<|,mid+);
} else
return query(rt<<,c);
} else {
if(c<=e[rt<<|].l+e[rt<<|].ls-) {
return query(rt<<|,c)+query(rt<<,mid);
} else
return query(rt<<|,c);
}
}
int main() {
// fre();
int n,q,top;
while(~scanf("%d%d",&n,&q)) {
build(,n,);
top=;
while(q--) {
char c;
int x;
cin>>c;
if(c=='D') {
cin>>x;
s[top++]=x;
update(,x,);
} else if(c=='Q') {
cin>>x;
printf("%d\n",query(,x));
} else {
x=s[--top];
update(,x,);
}
}
}
return ;
}
HDU 1540 Tunnel Warfare 线段树区间合并的更多相关文章
- hdu 1540 Tunnel Warfare 线段树 区间合并
题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...
- 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 线段树 单点更新,查询区间长度,区间合并
Tunnel Warfare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- Tunnel Warfare 线段树 区间合并|最大最小值
B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...
- HDU 1540 Tunnel Warfare (线段树)
Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...
- HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...
- HDU 1540 Tunnel Warfare (线段树或set水过)
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...
- HDU1540 Tunnel Warfare —— 线段树 区间合并
题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...
- HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举
HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...
随机推荐
- smarty 时间格式化date_format
代码如下:$smarty = new Smarty; $smarty->assign('yesterday', strtotime('-1 day')); $smarty->display ...
- Firefly的角色跳转场景简单示例
源地址:http://bbs.9miao.com/thread-45790-1-2.html 本例演示的是模拟游戏服务端,让角色在场景1中跳转到场景2中.在实际游戏中,client将要跳转的角色id和 ...
- Creating a new Signiant Transfer Engine because the previous transfer had to be canceled.
From: http://stackoverflow.com/questions/10548196/application-loader-new-weird-warning-about-signian ...
- web机制简笔
1 Web 1.1输入url地址 1.1.1服务器进行url解析,调用相关服务处理,返回处理结果—字符串 1.2得到返回字符串(显示描述+操作触发描述) 1.3Internet explore进行相关 ...
- auto_ptr,shared_ptr 智能指针的使用
Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...
- 1987-A. 集训队选拔
描述 南邮ACM暑期集训队一年一度的选拔如火如荼的开始了.按照以往的惯例,通过ACM校赛预赛和决赛的两轮选拔,成绩优异者将入选集训队,获得下半年在各大赛区现场赛上与各路神牛角逐奖牌的机会.但是,校赛的 ...
- 阿里云 EDAS-HSF 用户指南
阿里云 EDAS-HSF 用户指南 针对 EDAS v2.3.0©Alibaba EDAS 项目组2015/8/19 1 前言本文档旨在描述阿里云 EDAS 产品中应用服务化模块的基本概念,以及如何使 ...
- highcharts 切换
<!doctype html> <html lang="en"> <head> <script type="text/javas ...
- 基于ASP.NET的comet简单实现
http://www.cnblogs.com/hanxianlong/archive/2010/04/27/1722018.html 我潜水很多年,今天忽然出现.很久没写过博客了,不是因为不想写,而是 ...
- jquery ajax 访问webServer的xml文件
最近项目中要使用到通过ajax访问webServer的xml文件,通过下面的方式可以直接访问webServer的xml文件,不需要在web.xml中进行任何配置.它的返回参数就是服务器上的xml文件. ...