【线段树区间合并】POJ3667-Hotel
【题意】
一段区间初始均为可行。有两个操作:
1→找出长度为w的一段可行区间,如果存在则返回这个可行区间最靠左的情况,并将该区间设为不可行;
2→将区间[a,b]设为可行区间。
【思路】
经典的线段树合并,代码依旧用的是神犇的线段树模板。详见注释。
【错误点】
延迟标记的时候,忘记把cover清为-1了,导致RE!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int MAXN=+;
int cover[MAXN<<];//-1表示当前没有覆盖标记,1表示均覆盖为不可行,0表示均覆盖为可行
int lsum[MAXN<<];//该区间从左起连续的可用区间长度的最大值
int msum[MAXN<<];//该区间中连续的可用区间长度的最大值
int rsum[MAXN<<];//该区间从右起连续的可用区间长度的最大值 void PushUp(int rt,int m)
{
lsum[rt]=lsum[rt<<];
if (lsum[rt]==m-(m>>)) lsum[rt]+=lsum[rt<<|];
/*如果左孩子全部为可用区间,那么加上右孩子的左端*/
rsum[rt]=rsum[rt<<|];
if (rsum[rt]==m>>) rsum[rt]+=rsum[rt<<];
/*同上*/
msum[rt]=max(max(msum[rt<<],msum[rt<<|]) , rsum[rt<<]+lsum[rt<<|]);
/*该区间的可用区间可能是:左孩子最大的可用区间、有孩子最大的可用区间,和跨越左右孩子加在一起的可用区间*/
} void PushDown(int rt,int m)
{
if (cover[rt]!=-)
{
cover[rt<<]=cover[rt<<|]=cover[rt];
if (cover[rt]==)
{
msum[rt<<]=lsum[rt<<]=rsum[rt<<]=;
msum[rt<<|]=lsum[rt<<|]=rsum[rt<<|]=;
}
else
{
msum[rt<<]=lsum[rt<<]=rsum[rt<<]=m-(m>>);
msum[rt<<|]=lsum[rt<<|]=rsum[rt<<|]=m>>;
}
cover[rt]=-;
/*千万不要忘记将rt清为-1*/
}
} int query(int w,int l,int r,int rt)
{
if (l==r) return l;
PushDown(rt,r-l+);
int m=(l+r)>>;
if (msum[rt<<]>=w) return(query(w,lson));
/*由于要找最左边的区间,按照左孩子、跨越两者、有孩子的顺序查找*/
if (rsum[rt<<]+lsum[rt<<|]>=w) return(m-rsum[rt<<]+);
return(query(w,rson));
} void update(int L,int R,int o,int l,int r,int rt)
{
if (L<=l && r<=R)
{
cover[rt]=o;
if (o==) msum[rt]=lsum[rt]=rsum[rt]=;
else msum[rt]=lsum[rt]=rsum[rt]=r-l+;
return;
}
PushDown(rt,r-l+);//这里是l和r,不要写成L和R
int m=(l+r)>>;
if (L<=m) update(L,R,o,lson);
if (m<R) update(L,R,o,rson);
PushUp(rt,r-l+);
} void build(int l,int r,int rt)
{
msum[rt]=lsum[rt]=rsum[rt]=r-l+;
cover[rt]=-;
if (l==r) return;
int m=(l+r)>>;
build(lson);
build(rson);
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
build(,n,);
for (int i=;i<m;i++)
{
int op;
scanf("%d",&op);
if (op==)
{
int w;
scanf("%d",&w);
if (msum[]<w) cout<<<<endl;
/*如果根的可用区间已经小于w,那么一定是找不到长度为w的可用区间*/
else
{
int p=query(w,,n,);
cout<<p<<endl;
update(p,p+w-,,,n,);
}
}
else
{
int u,v;
scanf("%d%d",&u,&v);
update(u,u+v-,,,n,);
}
}
return ;
}
【线段树区间合并】POJ3667-Hotel的更多相关文章
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- Poj 3667——hotel——————【线段树区间合并】
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13124 Accepted: 5664 Descriptio ...
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- HYSBZ 1858 线段树 区间合并
//Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...
随机推荐
- vim 以16进制进行文件编辑
用 vim中二进制文件的编辑是先通过外部程序xxd来把文件dump成其二进制的文本形式,然后就可以按通常的编辑方式对文件进行编辑,编辑完成后再用xxd 转化为原来的形式即可. 可分如下几步进行: (1 ...
- Perl6 Bailador框架(1):开始
use v6; use Bailador; get '/' => sub { '<h1><center>Hello, World</center></h ...
- rabbitmq之核心构架和原理总结(四)
前言 前面博文已经将安装配置和站点管理介绍了,现在开始正式学习rabbitmq的使用了: rabbitMQ的构架 rabbitmq作为消息队列,一条消息从发布到订阅消费的完整流程为: 消息 --> ...
- devm_xxx机制
前言 devm是内核提供的基础机制,用于方便驱动开发者所分配资源的自动回收.参考内核文档devres.txt.总的来说,就是驱动开发者只需要调用这类接口分配期望的资源,不用关心释放问题.这些资源的释放 ...
- mysql连接池优化笔记
中间件mycat是一个高性能的分表分库读写分离的中间件,但配置不好的情况会出现很多性能问题. 1.mycat-web的监控的准确性有问题,1.6-RELEASE ,1.0-SNAPSHOT (web ...
- UCenter创始人、Discuz!创始人、管理员账号的认知(转)
UCenter创始人.Discuz!创始人.管理员账号的认知 什么是创始人?现在可能还有好多的站长对这个概念有点模糊,今天我给大家屡屡思路,讲讲这个概念性问题,没啥技术含量.已经明白这个概 ...
- C语言inline函数(转)
原文链接:http://blog.csdn.net/yuan1125/article/details/6225993 1 inline只是个编译器建议,编译器不一定非得展开Inline函数. 例如: ...
- poj 1426(同余搜索)
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26926 Accepted: 111 ...
- Visual Studio for Mac 安装时无法连接到网络等问题
问题: 1.下载 vs for mac 离线安装包 离线下载地址https://download.microsoft.com/download/3/d/4/3d42f40f-4f0a-4613-920 ...
- js对象替换键值名称
js对象替换键值名称 将obj中的id和name字段替换分别替换成为“@id”,“@name” 代码如下: let obj = [{id:,name:,name:"李四"}].ma ...