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 ...
随机推荐
- MySQL Replication 常用架构
转自: http://www.cnblogs.com/ggjucheng/archive/2012/11/13/2768879.html 前言 MySQLReplicaion本身是一个比较简单的架构, ...
- [转载]MongoDB的$inc修改器
MongoDB的$inc修改器相当于编程语言中的 “+=”“$inc”只能用于操作数值类型的数据,包括整数.长整数和双精度浮点数,用于其他类型的数据会导致操作失败. >db.users.find ...
- 自助Linux之问题诊断工具strace
转 http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...
- Java 内存结构备忘录
本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java 内存结构有所帮助.原文作者 Sumith Puri,本文系 OneAPM 工程师编译 ...
- Eclipse字体修改设置
修改字体 Window -> Preferences -> General -> Appearences -> Colors and Fonts 选择java选项,看到Java ...
- WCF异步
WCF异步与否由客户端来决定 服务端接口: // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”. [ServiceContract] ...
- linux netcat命令
netcat是网络工具中的“瑞士军刀”,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所 ...
- android SharedPreferences apply和commit的区别
1.apply没有返回值而commit返回boolean表明修改是否提交成功2.apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘3.apply ...
- C# 字符串加密解密方法
这个是加密的算法的命名空间,使用加密算法前要引用该程序集 System.Security.Cryptography using System;using System.Data;using Syst ...
- ubuntu12.04 make xconfig出错解决
xconfig是linux下X Window环境中用于配制的一个工具,和menuconfig相似,但用法更友好方便,用如下命令可以进入配制界面: make xconfig 因为在ubuntu系统中,编 ...