hdu 1540 Tunnel Warfare 线段树 区间合并
题意:
三个操作符
D x:摧毁第x个隧道
R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈
Q x:查询x所在的最长未摧毁隧道的区间长度。
1.如果当前区间全是未摧毁隧道,返回长度
2.如果在坐儿子的右区间或右儿子的左区间,返回这两个区间长度和
3.继续递归
#include <bits/stdc++.h>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std; const int MAXN = 55555;
int mx[MAXN<<2], lmx[MAXN<<2], rmx[MAXN<<2];
int des[MAXN]; void push_up(int rt, int len)
{
lmx[rt] = lmx[rt<<1];
rmx[rt] = rmx[rt<<1|1];
if(lmx[rt] == len - (len >> 1)) lmx[rt] += lmx[rt<<1|1];
if(rmx[rt] == len >> 1) rmx[rt] += rmx[rt<<1];
mx[rt] = max(rmx[rt<<1] + lmx[rt<<1|1], max(mx[rt<<1], mx[rt<<1|1]));
} void build(int l, int r, int rt)
{
mx[rt] = lmx[rt] = rmx[rt] = r - l + 1;
if(l == r) return;
int m = (l + r) >> 1;
build(lson);
build(rson);
} void update(int p, int c, int l, int r, int rt)
{
if(l == r)
{
mx[rt] = c;
lmx[rt] = c;
rmx[rt] = c;
return;
}
int m = (l + r) >> 1;
if(p <= m) update(p, c, lson);
else update(p, c, rson);
push_up(rt, r-l+1);
} int query(int p, int l, int r, int rt)
{
if(mx[rt] == 0) return 0;
if(mx[rt] == r - l + 1) return r - l + 1;
int m = (l + r) >> 1;
if(p > m - rmx[rt<<1] && p <= m + lmx[rt<<1|1])
return rmx[rt<<1] + lmx[rt<<1|1];
if(p <= m) return query(p, lson);
return query(p, rson);
} int main()
{
// freopen("in.txt", "r", stdin);
int n, m;
while(~scanf("%d%d", &n, &m))
{
build(1, n, 1);
int cnt = 0;
while(m--)
{
int x;
char op[3];
scanf("%s", op);
if(op[0] == 'D')
{
scanf("%d\n", &x);
des[cnt++] = x;
update(x, 0, 1, n, 1);
}
else if(op[0] == 'R')
{
if(cnt == 0) continue;
update(des[--cnt], 1, 1, n, 1);
}
else
{
scanf("%d", &x);
printf("%d\n", query(x, 1, n, 1));
}
}
}
return 0;
}
hdu 1540 Tunnel Warfare 线段树 区间合并的更多相关文章
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- 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 ...
随机推荐
- 有没有一种组合字体,中文是宋体,英文是times new roman?
有没有一种组合字体,中文是宋体,英文是times new roman? 由于日常科研工作书写需要,想问问各位大神有没有一种字体,中文是宋体,西文是times new roman,这样写论文好方便啊有没 ...
- Chm文件阅读软件测试需求
转发: .Chm文件阅读软件测试需求 . xchm问题太多就不考虑了: kchm是问题少一些 windows打开是乱码就不去考虑 必须在windows打开正常的再在龙芯上打开 1windows打开是乱 ...
- 015.Python函数名的使用以及函数变量的操作
一 函数名的使用 python中的函数可以像变量一样,动态创建,销毁,当参数传递,作为值返回,叫第一类对象.其他语言功能有限 1.1 函数名是个特殊的变量,可以当做变量赋值 def func(): p ...
- Linux进阶之正则,shell三剑客(grep,awk,sed),cut,sort,uniq
一.正则表达式:Regular Expression 正则表达式:正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式 ...
- STM32 库函数 延时函数计算
- Centos7 网卡DHCP重新获取IP地址
问题:局域网内一台linux系统(Centos7.4)DHCP自动获取的IP地址和另一台手动配置的静态IP冲突了 解决方法:让DHCP自动获取的IP地址重新获取一个别的IP地址 DHCP重新获取IP ...
- Python - random 库的详细使用
前言 为啥突然写这个?因为用到就写呗,感觉对生成数据很有用,之前都是百度别人的,今天来对着官方文档写,超级标准! 这边只讲常用的,看了下文档还有什么数学方法,太高级好像用不上 返回整数 random. ...
- 解决idea查不到插件
http://127.0.0.1:1080
- 整数划分——区间dp(石子合并)
这不是将一个数以一来划分,而是把一个整数以位来划分 题目描述 如何把一个正整数N(N长度<20)划分为M(M>1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式 ...
- 策略模式干掉if-else,switch
1.传统if -else 写法 String nodeModelStr = ""; if (nodeType == NodeType.START){ StartModel star ...