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 这个题目 ...
随机推荐
- 【Javascript + Vue】实现对任意迷宫图片的自动寻路
前言 可以直接体验最终效果:https://maze-vite.vercel.app/ 寻路前: 寻路后,自动在图片上生成红色路径,蓝色是探索过的区域: 这里我故意用手机斜着角度拍,就是为了展示程序完 ...
- 基于redis实现的四种常见的限流策略
引言 在web开发中功能是基石,除了功能以外运维和防护就是重头菜了.因为在网站运行期间可能会因为突然的访问量导致业务异常.也有可能遭受别人恶意攻击 所以我们的接口需要对流量进行限制.俗称的QPS也是对 ...
- MySQL零散知识点(02)
存储过程 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql,类似于python中的自定义函数 基本使用 delimiter $$ crea ...
- 31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本
在上章我们学习了ListView,然后实现了: 28.qt quick-ListView高仿微信好友列表和聊天列表,本章我们来学习SwipeView滑动视图,并出高仿微信V2版本: 1.Contain ...
- 面试官:一个TCP连接可以发多少个HTTP请求?
曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式.什 ...
- Linux常用命令详解下
Linux常用命令详解 目录 一.Linux常用命令 1.1.查看及切换目录(pwd.cd.ls.du) 1.2.创建目录和文件(mkdir.touch.ln) 1.3.复制.删除.移动目录和文件(c ...
- java变量及常量
变量 本质:就是代表一个"可操作的存储空间",空间位置是确定的,但是里面放置什么值不确定.我们可通过变量名来访问"对应的存储空间",从而操纵这个"存储 ...
- DNS 解析过程
DNS 是应用层协议,用于将域名转换成 IP 地址. 1. 解析过程 DNS 的核心系统是一个三层的树状.分布式服务,基本对应域名的结构. 根域名服务器:管理顶级域名服务器,返回 com.net.cn ...
- 14、mysql主从复制实战
14. 1.服务器准备: 一台服务器,多实例,客户端编码是utf8,服务端编码是utf8; [root@backup 3308]#netstat -tunlp | grep 330 tcp 0 0 0 ...
- 在windows的情况下面右键添加vim
1, 首先打开注册表,然后打开下面路径: HKEY_CLASSES_ROOT\*\Shell 2, 右键新建项(也就是右键的文字): 用vim编辑 3, 在"用vim编辑"下面再 ...