Tunnel Warfare(线段树取连续区间)
emmmmmmmm我菜爆了
思路来自:https://blog.csdn.net/chudongfang2015/article/details/52133243
线段树最难的应该就是要维护什么东西
这道题刚开始1~n都是连通的
D x 即破坏x这个地方
Q x 即查询包含x的连续区间有多长
R 即修复最后一次D的x
博主给了一个非常好的思路
线段树维护两个值,该区间内被破坏的最大的点,以及最小的那个点
如 1,2,...,,6 破坏了 2 ,4,5 那么该区间里的pmax = 5,pmin = 2
若要查询3 则取3右边的pmin 减去 3左边的pmax 再减1
3右的pmin = 4, 3左的pmax = 2 即为 4 - 2 - 1 = 1
未被破坏的点或者区间的pmax pmin分别设为0,n + 1
这样就能query的值能直接用来计算
比如1,2,3,4,5均为被破坏
则pmin - pmax - 1 = n = 5
特殊情况就为查询的x自身被破坏了
pmin = pmax = x 这样打印的结果是-1,所以打印的时候取一下pmin-pmax-1和0的最大值就好了
(orz多转换思路,试试各种值的维护)
#include <cstdio>
#include <algorithm>
#define lp p<<1
#define rp p<<1|1
using namespace std;
const int maxn = 5e4 + ;
int pmin[maxn<<], pmax[maxn<<];
int des[maxn], n; void build(int p, int l, int r) {
if (l == r) {
pmin[p] = n + ;
pmax[p] = ;
return;
}
int mid = l + r >> ;
build(lp, l, mid);
build(rp, mid + , r);
pmax[p] = max(pmax[lp], pmax[rp]);
pmin[p] = min(pmin[lp], pmin[rp]);
}
void update(int p, int l, int r, int pos, int num1, int num2) {
if (l == r) {
pmax[p] = num1;
pmin[p] = num2;
return;
}
int mid = l + r >> ;
if (pos <= mid) {
update(lp, l, mid, pos, num1, num2);
} else {
update(rp, mid + , r, pos, num1, num2);
}
pmax[p] = max(pmax[lp], pmax[rp]);
pmin[p] = min(pmin[lp], pmin[rp]);
}
int query_min(int p, int l, int r, int x, int y) {
if (x <= l && y >= r) return pmin[p];
int mid = l + r >> ;
int res = 0x3f3f3f3f;
if (x <= mid) res = min(res, query_min(lp, l, mid, x, y));
if (y > mid) res = min(res, query_min(rp, mid + , r, x, y));
return res;
}
int query_max(int p, int l, int r, int x, int y) {
if (x <= l && y >= r) return pmax[p];
int mid = l + r >> ;
int res = ;
if (x <= mid) res = max(res, query_max(lp, l, mid, x, y));
if (y > mid) res = max(res, query_max(rp, mid + , r, x, y));
return res;
} int main() {
int m;
while (~scanf("%d%d", &n, &m)) {
int last = ;
build(, , n);
while (m--) {
char opt[];
scanf("%s", opt);
if (opt[] == 'D') {
int p;
scanf("%d", &p);
update(, , n, p, p, p);
des[++last] = p;
} else if (opt[] == 'R') {
update(, , n, des[last--], , n + );
} else {
int q;
scanf("%d", &q);
int ans1 = query_max(, , n, , q), ans2 = query_min(, , n, q, n);
printf("%d\n", ans2 - ans1 - > ? ans2 - ans1 - : );
}
}
}
return ;
}
对博主的代码简化了一下下(
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 Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...
- Tunnel Warfare 线段树 区间合并|最大最小值
B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...
- hdu1540 Tunnel Warfare 线段树/树状数组
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
Tunnel Warfare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 1540 Tunnel Warfare (线段树或set水过)
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...
- HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...
- HDU1540 Tunnel Warfare —— 线段树 区间合并
题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...
随机推荐
- 江苏省选2019Round1游记
JSOI2019R1过去了. Day0 打板子.看白书. 晚上太热了,楼下还在打铁,睡不着. 折腾到好晚才勉强睡着. Day1 早上好困啊. 开T1.看起来T1的60分很可做的样子?5min打完了(为 ...
- Luogu P4169 [Violet]天使玩偶/SJY摆棋子
传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...
- missing 1 required positional argument: 'on_delete'报错解决方案
最近在使用Python的Django框架开发web站点,通过models.py文件建表后,执行数据库迁移(命令行:mange.py makemigrations)时报错,下面是查看官方文档后找到的解决 ...
- odoo学习总结
odoo10总结 1.odoo中的向导应用. .py文件 # -*- coding: utf-8 -*-f ...
- FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!
一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...
- Linux、Windows如何进行性能监控与调优
1.Linux命令行工具 推荐:CentOS 7 1.1 top命令 top命令的输出如下: top命令的输出可以分为两部分:前半部分是系统统计信息,后半部分是进程信息.在统计信息中, 第1行是任务队 ...
- 微信小程序—如何获取用户输入文本框的值
我们就拿简单常用的登录来举例子吧,先看最终效果图片
- Vue(三)之前端路由
01-前端路由 1.前端路由的实现原理 vue+vue-router 主要来做单页面应用(Single Page Application) 为什么我们要做单页面应用? (1)传统的开发方式 url改变 ...
- python第四章:函数--小白博客
Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- PS调出水彩画效果古装人物照片
首先在PS里操作: 1.磨皮液化 磨皮液化就不细说啦~常规操作. 2.背景调色 分析:想塑造油画般的感觉,背景颜色想要蓝绿色 1.用可选颜色工具里面的中性色改变整体颜色,把皮肤和头发颜色用蒙版擦出来: ...