POJ3667 Hotel 题解
和最大子段和的思路是一样的,可以记 \(lmax,rmax,dat\) 分别表示从当前区间最靠左/右的最大连续空子段和当前区间的最大连续空子段。
需要用延迟标记,每次遇到开房操作先ask
,如果能找到就修改这一段。
注意更新节点时要讨论左/右区间是否全部空/非空。
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=5e4;
struct Edge
{
int l,r,dat,lmax,rmax,tag;
#define l(x) t[x].l
#define r(x) t[x].r
#define tag(x) t[x].tag
#define len(x) (t[x].r-t[x].l+1)
}t[(N<<2)+5];
int n,m;
void build(int rt,int l,int r)
{
l(rt)=l,r(rt)=r;
t[rt].dat=t[rt].lmax=t[rt].rmax=r-l+1;
if(l==r) return;
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
}
inline void pushdown(int rt)
{
if(!tag(rt)) return;
tag(rt<<1)=tag(rt<<1|1)=tag(rt);
t[rt<<1].dat=t[rt<<1].lmax=t[rt<<1].rmax=tag(rt)==1?0:len(rt<<1);
t[rt<<1|1].dat=t[rt<<1|1].lmax=t[rt<<1|1].rmax=tag(rt)==1?0:len(rt<<1|1);
tag(rt)=0;
}
int ask(int rt,int x)
{
pushdown(rt);
if(l(rt)==r(rt)) return l(rt);
if(t[rt<<1].dat>=x) return ask(rt<<1,x);
int mid=l(rt)+r(rt)>>1;
if(t[rt<<1].rmax+t[rt<<1|1].lmax>=x) return mid-t[rt<<1].rmax+1;
return ask(rt<<1|1,x);
}
void change(int rt,int l,int r,int tag)
{
if(l<=l(rt)&&r>=r(rt))
{
t[rt].dat=t[rt].lmax=t[rt].rmax=tag==1?0:len(rt);
tag(rt)=tag; return;
}
pushdown(rt);
int mid=l(rt)+r(rt)>>1;
if(l<=mid) change(rt<<1,l,r,tag);
if(r>mid) change(rt<<1|1,l,r,tag);
if(t[rt<<1].dat==len(rt<<1))
t[rt].lmax=len(rt<<1)+t[rt<<1|1].lmax;
else t[rt].lmax=t[rt<<1].lmax;
if(t[rt<<1|1].dat==len(rt<<1|1))
t[rt].rmax=len(rt<<1|1)+t[rt<<1].rmax;
else t[rt].rmax=t[rt<<1|1].rmax;
t[rt].dat=max(max(t[rt<<1].dat,t[rt<<1|1].dat),t[rt<<1].rmax+t[rt<<1|1].lmax);
}
int main()
{
scanf("%d%d",&n,&m);
build(1,1,n);
for(int i=1,op;i<=m;++i)
{
scanf("%d",&op);
if(op==1)
{
int x; scanf("%d",&x);
if(t[1].dat>=x)
{
int l=ask(1,x);
printf("%d\n",l);
change(1,l,l+x-1,1);
}
else puts("0");
}
else
{
int l,x; scanf("%d%d",&l,&x);
change(1,l,l+x-1,2);
}
}
return 0;
}
POJ3667 Hotel 题解的更多相关文章
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- [POJ3667]Hotel(线段树,区间合并)
题目链接:http://poj.org/problem?id=3667 题意:有一个hotel有n间房子,现在有2种操作: 1 a,check in,表示入住.需要a间连续的房子.返回尽量靠左的房间编 ...
- [USACO08FEB]Hotel 题解
正确的题解 首先我们都知道这题要用线段树做.考虑维护靠左边的answer,靠右边的answer,和整个区间的answer,那么就珂以维护这道题目了. 这里比较复杂的有下传操作和上传操作. 上传 voi ...
- poj3667 Hotel
此题不难却易出错,很能考察思维的严谨性. 指定ll为区间内左端顶格数的连续可利用房间,rr为右端顶格数的数值,mm为区间内最长的连续可利用房间数. 在查询的时候,由于要返回最靠左的区间左端点,使得在该 ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
- bzoj4543[POI2014]Hotel
题目链接 bzoj4543 [POI2014]Hotel 题解 这不是裸地点分嘛 ,我真傻,真的 n^2 这不是是sb题,~滑稽 ~ 枚举点转换为无根树,暴力子树中点的深度 计数转移 令a b c d ...
- HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)
传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请 ...
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- HDU 3308 LCIS 线段树区间更新
最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛 ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...
随机推荐
- 一文彻底理解Apache Hudi的多版本清理服务
Apache Hudi提供了MVCC并发模型,保证写入端和读取端之间快照级别隔离.在本篇博客中我们将介绍如何配置来管理多个文件版本,此外还将讨论用户可使用的清理机制,以了解如何维护所需数量的旧文件版本 ...
- 【NX二次开发】根据视图名称旋转视图,在布局中替换视图uc6464
uc6464("布局名","旧视图名","新视图名");输入布局名.旧视图名.新视图名.如果布局名为空则更新当前布局.如果旧视图名为空,则工 ...
- 【NX二次开发】体素特征相关函数(块、柱、锥、球)
NX Open允许用户创建和查询所有基本体素特征,通过API函数建立基本体素特征返回的是相应的特征标识,如果需要可以通过函数UG_MODL_ask_feat_body()获得特征对应的实体对象标识.基 ...
- 09:jQuery(02)
内容概要 jQuery操作标签 jQuery绑定事件 jQuery补充知识点 jQuery动画效果(了解) 零散补充 内容详细 jQuery练习题 $('#i1') r.fn.init [div#i1 ...
- 史上最详细的Air7xx驱动安装教程
由于Air7xx系列4G模块需要安装USB驱动,但是很多开发者对USB驱动的安装方法不是十分了解,所以经常出现问题,导致安装失败.特书此文,手把手教你装USB驱动. 第一步 从官网下载最新的驱动程序 ...
- Django(68)drf分页器的使用
前言 当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面 PageNumberPagination:基础分页器,性能略差 LimitOffsetP ...
- 「10.14」小P的2048(模拟)·小P的单调数列(性质,DP)·小P的生成树(乱搞)
A. 小P的2048 模拟.....又没啥可说的,以后要认真打打模拟题了... B. 小P的单调数列 考场$n^2log(n)$的SB思路有人听吗 正解当然不是这样, 事实上我们每次选取的只有一段区间 ...
- 【模板】关于vector的lower_bound和upper_bound以及vector基本用法 STL
关于lower_bound和upper_bound 共同点 函数组成: 一个数组元素的地址(或者数组名来表示这个数组的首地址,用来表示这个数组的开头比较的元素的地址,不一定要是首地址,只是用于比较的& ...
- sleep、wait方法之间区别
sleep.wait方法之间区别 1.所属的类不同 sleep是Thread类的静态方法,而wait是Object类的成员方法 2.锁机制不一样 sleep方法:会让出资源调度器为当前线程分配的时间片 ...
- 《手把手教你》系列基础篇之(三)-java+ selenium自动化测试- 启动三大浏览器(上)(详细教程)
1.简介 前边宏哥已经将环境搭建好了,今天就在Java项目搭建环境中简单地实践一下: 启动三大浏览器.按市场份额来说,全球前三大浏览器是:IE.Firefox.Chrome.因此宏哥这里主要介绍一下如 ...