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 这个题目 ...
随机推荐
- 面试一次问一次,HashMap是该拿下了(一)
文章目录 前言 一.HashMap类图 二.源码剖析 1. HashMap(jdk1.7版本) - 此篇详解 2. HashMap(jdk1.8版本) 3. ConcurrentHashMap ~~ ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- 三、Nginx设置用户认证
要求:通过nginx服务端配置实现以下目标 访问web页面需要进行用户认证. 用户名为:tom,密码:123456 操作步骤, 更改配置文件 [root@client ~]# vim /usr/loc ...
- 【NX二次开发】Block UI 选择小平面区域
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- 【NX二次开发】NX内部函数,pskernel.dll文件中的内部函数
pskernel.dll文件中的内部函数,含有部分pk函数,用法可以查看pk函数帮助: ADPAPE ADVXED APPTRA ATGETO ATTGEO BLECHK BLECRB BLECVR ...
- NOIP模拟测试2「排列 (搜索)·APIO划艇」
排序 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 输入格式 数据范围与提示 对于30%的数据,1<=N<=4: 对于全部的数据,1<=N< ...
- HTTP Cookies知识-查看、发送、获取、返回
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 HTTP Cookies是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求 ...
- SQL Prompt快捷键
1. DF DELETE FROM 2. ssf SELECT * FROM 3. be BEGIN END 4. ij INNER JOIN 5. ap ALTER PROCEDURE 6 ...
- 一篇技术博文引发的stylelint项目实践
背景 看到项目中团队成员写CSS样式风格迥异,CSS样式的书写顺序没有鲜明的规范.想到以前看过CSS样式书写顺序的文章,决定找出来,给团队成员科普一下.查阅了好几篇文章,觉得这篇文章给出的理由最硬核, ...
- Dagger2入门,以初学者角度
2016-12-21 更新:添加@Subcomponent注解以及Lazy与Provider的使用,本文基本完结!如果有好的建议请提出,感谢大家的支持,谢谢 依赖注入 Dagger2是Android中 ...