和最大子段和的思路是一样的,可以记 \(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 题解的更多相关文章

  1. poj3667 Hotel (线段树 区间合并)

    poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...

  2. [POJ3667]Hotel(线段树,区间合并)

    题目链接:http://poj.org/problem?id=3667 题意:有一个hotel有n间房子,现在有2种操作: 1 a,check in,表示入住.需要a间连续的房子.返回尽量靠左的房间编 ...

  3. [USACO08FEB]Hotel 题解

    正确的题解 首先我们都知道这题要用线段树做.考虑维护靠左边的answer,靠右边的answer,和整个区间的answer,那么就珂以维护这道题目了. 这里比较复杂的有下传操作和上传操作. 上传 voi ...

  4. poj3667 Hotel

    此题不难却易出错,很能考察思维的严谨性. 指定ll为区间内左端顶格数的连续可利用房间,rr为右端顶格数的数值,mm为区间内最长的连续可利用房间数. 在查询的时候,由于要返回最靠左的区间左端点,使得在该 ...

  5. 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel

    题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...

  6. bzoj4543[POI2014]Hotel

    题目链接 bzoj4543 [POI2014]Hotel 题解 这不是裸地点分嘛 ,我真傻,真的 n^2 这不是是sb题,~滑稽 ~ 枚举点转换为无根树,暴力子树中点的深度 计数转移 令a b c d ...

  7. HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)

    传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请 ...

  8. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  9. HDU 3308 LCIS 线段树区间更新

    最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛  ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...

随机推荐

  1. NEXTCLOUD 常见错误

    HTTP请求头"Strict-Transport-Security"没有配置为至少"15552000"秒出于增强安全性考虑推荐按照安全提示中的说明启用HSTS ...

  2. 《手把手教你》系列基础篇之(二)-java+ selenium自动化测试-环境搭建(下)基于Maven(详细教程)

    1.简介 Apache Maven是一个软件项目管理和综合工具.基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件.由于现在企业和公司中Java的大部分项目都是基 ...

  3. WEB安全新玩法 [6] 防范图形验证码重复使用

    在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施.为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码.iFlow 业务安全加固平台可以加强这方面的处理. 某网站系 ...

  4. Centos7一键配置阿里云yum源脚本

    Centos7一键配置阿里云yum源脚本 工作中linux系统经常要配置网络yum,故写了一个简单的配置阿里云yum源的的脚本可以单独使用也可以在做自动化部署的时候调用. #!/bin/bash # ...

  5. Excel选择区域一次性替换小于200的数值

    1.ctrl+F,点击"选项",在出来的扩展框选择"格式"后小三角,选择"从单元格选择格式": 2.选择要进行替换小于200的区域: . 3 ...

  6. excel VBA使用教程

    1.选择文件--选项 2.选择自定义功能区--开发工具的√勾上

  7. SpringCloud Alibaba实战(11:引入服务网关Gateway)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 在前面的章节中,我们已经完成了服务间的调用.统一配置等等,在这 ...

  8. 42、mysql数据库(函数)

    1.mysql中提供的内置函数: (1)数学函数: 1)ROUND(x,y): 返回参数x的四舍五入的有y位小数的值.x不可转换时返回0,x为null时返回null. 2)RAND(): 返回0到1内 ...

  9. java设计模式(10):代理模式(Proxy)

    一,定义:  代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 二,其类图: 三,分类一:静态代理 1,介绍:也就是需要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对 ...

  10. hdu 1145(Sticks) DFS剪枝

    Sticks Problem Description George took sticks of the same length and cut them randomly until all par ...