hdu 1540 Tunnel Warfare(线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1540
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少。
其实这题直接二分查找也可以,但用线段树可以练一练手。
大致思路就是找查询点最近的左右两个0的位置(0表示被摧毁的),然后输出区间大小即可,如果这个点已经被摧毁那么就没有
连续的区间,那么输出0。线段树查询位置有点麻烦具体看代码。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
const int M = 5e4 + 10;
struct TnT {
int l , r , num;
}T[M << 2];
int n , m;
void build(int l , int r , int p) {
int mid = (l + r) >> 1;
T[p].l = l , T[p].r = r;
if(T[p].l == T[p].r) {
T[p].num = 1;
return;
}
build(l , mid , p << 1);
build(mid + 1 , r , (p << 1) | 1);
T[p].num = T[p << 1].num + T[(p << 1) | 1].num;
}
void updata(int pos , int p , int ad) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == T[p].r && T[p].l == pos) {
T[p].num = ad;
return ;
}
if(mid >= pos) {
updata(pos , p << 1 , ad);
}
else {
updata(pos , (p << 1) | 1 , ad);
}
T[p].num = T[p << 1].num + T[(p << 1) | 1].num;
}
int queryr(int p , int l , int r) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l >= l && T[p].r <= r) {
if(T[p].l == T[p].r) {
if(T[p].num == 0) {
return T[p].l;
}
else {
return n + 1;
}
}
if(T[p << 1].r - T[p << 1].l + 1 > T[p << 1].num) {
return queryr(p << 1 , l , r);
}
else {
return queryr((p << 1) | 1 , l , r);
}
}
if(mid >= r) {
return queryr(p << 1 , l , r);
}
else if(mid < l) {
return queryr((p << 1) | 1 , l , r);
}
else {
return min(queryr(p << 1 , l , mid) , queryr((p << 1) | 1 , mid + 1 , r));
}
}
int queryl(int p , int l , int r) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l >= l && T[p].r <= r) {
if(T[p].l == T[p].r) {
if(T[p].num == 0) {
return T[p].l;
}
else {
return 0;
}
}
if(T[(p << 1) | 1].r - T[(p << 1) | 1].l + 1 > T[(p << 1) | 1].num) {
return queryl((p << 1) | 1 , l , r);
}
else {
return queryl(p << 1 , l , r);
}
}
if(mid >= r) {
return queryl(p << 1 , l , r);
}
else if(mid < l) {
return queryl((p << 1) | 1 , l , r);
}
else {
return max(queryl(p << 1 , l , mid) , queryl((p << 1) | 1 , mid + 1 , r));
}
}
int query(int p , int pos) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == T[p].r) {
return T[p].num;
}
if(mid >= pos) {
return query(p << 1 , pos);
}
else {
return query((p << 1) | 1 , pos);
}
}
int main() {
while(~scanf("%d%d" , &n , &m)) {
build(1 , n , 1);
char cp[2];
stack<int>ss;
int mm;
for(int i = 0 ; i < m ; i++) {
scanf("%s" , cp);
if(cp[0] == 'D') {
scanf("%d" , &mm);
updata(mm , 1 , 0);
ss.push(mm);
}
if(cp[0] == 'Q') {
scanf("%d" , &mm);
int g = query(1 , mm);
if(g == 0) {
printf("0\n");
continue;
}
int L = queryl(1 , 1 , mm);
int R = queryr(1 , mm , n);
printf("%d\n" , R - L - 1);
}
if(cp[0] == 'R') {
if(!ss.empty()) {
int gl = ss.top();
ss.pop();
updata(gl , 1 , 1);
}
}
}
}
return 0;
}
hdu 1540 Tunnel Warfare(线段树)的更多相关文章
- 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 线段树区间合并
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 ...
- HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...
- HDU 1540 Tunnel Warfare (线段树或set水过)
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...
- 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) P ...
- HDU 1540 Tunnel Warfare(最长连续区间 基础)
校赛,还有什么途径可以申请加入ACM校队? Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
随机推荐
- UE4 代理 BindRaw和BindUObject
代理允许您在C++对象上以通用的但类型安全的方式调用成员函数.通过使用代理,可以将其动态地绑定到任何对象的成员函数上,然后在该对象上调用函数,即时调用者不知道该对象的类型也没关系. 任何时候都应该通过 ...
- 关于asp.net调用gemalto超级狗api的具体实现
鉴于网上关于超级狗的具体操作并不详细,我把我所知道的写下来,希望能给有需求的网友做个参考.软件外壳保护我就不说了,没有什么难度,供应商也会提供文档,一步一步操作即可.我要说的是用于保护发给客户的程序, ...
- Samba:基于公网 IP 的服务访问
写在前面的话 由于使用过程中,发现如果 Samba 只用于内网访问,同事在外面甚至其它不是一个网段的同事就无法访问了.这显然不符合我们最终的需求,最后没法,只能把访问部署到云服务器上面去,此时问题来了 ...
- jq css3实现跑马灯+大转盘
前端效果, <!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" con ...
- T-SQL基础语句
存储过程允许标准组件式编程(模块化设计) 存储过程能够实现快速的执行速度 存储过程能够减少网络流量 存储过程可被作为一种安全机制充分利用 在SQL Server 的系列版本中存储过程分为两类:系统提供 ...
- map redcue filter sorted函数
sorted 函数 接收一个key函数来实现自定义的排序 # 训练集和验证集的文件命名不一样 # test1: data/test1/8973.jpg # train: data/train/cat. ...
- 微信小程序页面跳转url如何传对象参数
两步走 首先第一步:wx.navigateTo({ url:"XXX"+"¶ms="+ JSON.stringify(obj); }) 第二步获 ...
- 记录 Java 的 BlockingQueue 中的一些坑
最近学习了 BlockingQueue,发现 java 的 BlockingQueue 并不是每一个实现都按照 BlockingQueue 的语意来的,其中有不少坑. 直接上代码吧: 1.关于Prio ...
- 史上最全面的SignalR系列教程-5、SignalR 实现一对一聊天
1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...
- Hyper-V修改Docker for Windows存储设置
自从Win10安装了Docker for Windows后,C盘容量爆炸,必须做一波迁移了.我的Docker使用的是Windows的Hyper-V虚拟机,于是google了一番找到以下一篇文章 doc ...