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(线段树取连续区间)的更多相关文章

  1. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  2. hdu 1540 Tunnel Warfare(线段树区间统计)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  3. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  4. Tunnel Warfare 线段树 区间合并|最大最小值

    B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...

  5. hdu1540 Tunnel Warfare 线段树/树状数组

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  6. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

    Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  7. HDU 1540 Tunnel Warfare (线段树或set水过)

    题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...

  8. HDU 1540 Tunnel Warfare (线段树)

    题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...

  9. HDU1540 Tunnel Warfare —— 线段树 区间合并

    题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...

随机推荐

  1. 江苏省选2019Round1游记

    JSOI2019R1过去了. Day0 打板子.看白书. 晚上太热了,楼下还在打铁,睡不着. 折腾到好晚才勉强睡着. Day1 早上好困啊. 开T1.看起来T1的60分很可做的样子?5min打完了(为 ...

  2. Luogu P4169 [Violet]天使玩偶/SJY摆棋子

    传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...

  3. missing 1 required positional argument: 'on_delete'报错解决方案

    最近在使用Python的Django框架开发web站点,通过models.py文件建表后,执行数据库迁移(命令行:mange.py makemigrations)时报错,下面是查看官方文档后找到的解决 ...

  4. odoo学习总结

                                                   odoo10总结 1.odoo中的向导应用. .py文件 # -*- coding: utf-8 -*-f ...

  5. FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!

    一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...

  6. Linux、Windows如何进行性能监控与调优

    1.Linux命令行工具 推荐:CentOS 7 1.1 top命令 top命令的输出如下: top命令的输出可以分为两部分:前半部分是系统统计信息,后半部分是进程信息.在统计信息中, 第1行是任务队 ...

  7. 微信小程序—如何获取用户输入文本框的值

    我们就拿简单常用的登录来举例子吧,先看最终效果图片

  8. Vue(三)之前端路由

    01-前端路由 1.前端路由的实现原理 vue+vue-router 主要来做单页面应用(Single Page Application) 为什么我们要做单页面应用? (1)传统的开发方式 url改变 ...

  9. python第四章:函数--小白博客

    Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  10. PS调出水彩画效果古装人物照片

    首先在PS里操作: 1.磨皮液化 磨皮液化就不细说啦~常规操作. 2.背景调色 分析:想塑造油画般的感觉,背景颜色想要蓝绿色 1.用可选颜色工具里面的中性色改变整体颜色,把皮肤和头发颜色用蒙版擦出来: ...