POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 13805 | Accepted: 5996 |
Description
The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on famed Cumberland Street as their vacation
residence. This immense hotel has N (1 ≤ N ≤ 50,000) rooms all located on the same side of an extremely long hallway (all the better to see the lake, of course).
The cows and other visitors arrive in groups of size Di (1 ≤
Di ≤ N) and approach the front desk to check in. Each group
i requests a set of Di contiguous rooms from Canmuu, the moose staffing the counter. He assigns them some set of consecutive room numbers
r..r+Di-1 if they are available or, if no contiguous set of rooms is available, politely suggests alternate lodging. Canmuu always chooses the value of
r to be the smallest possible.
Visitors also depart the hotel from groups of contiguous rooms. Checkout i has the parameters Xi and
Di which specify the vacating of rooms Xi ..Xi +Di-1 (1 ≤
Xi ≤ N-Di+1). Some (or all) of those rooms might be empty before the checkout.
Your job is to assist Canmuu by processing M (1 ≤ M < 50,000) checkin/checkout requests. The hotel is initially unoccupied.
Input
* Line 1: Two space-separated integers: N and M
* Lines 2..M+1: Line i+1 contains request expressed as one of two possible formats: (a) Two space separated integers representing a check-in request: 1 and
Di (b) Three space-separated integers representing a check-out: 2,
Xi, and Di
Output
* Lines 1.....: For each check-in request, output a single line with a single integer
r, the first room in the contiguous sequence of rooms to be occupied. If the request cannot be satisfied, output 0.
Sample Input
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
Sample Output
1
4
7
0
5
Source
题意:有一个线段,从1到n。以下m个操作,操作分两个类型,以1开头的是查询操作,以2开头的是更新操作
1 w 表示在总区间内查询一个长度为w的可用区间,而且要最靠左,能找到的话返回这个区间的左端点并占用了这个区间,找不到返回0
好像n=10 , 1 3 查到的最左的长度为3的可用区间就是[1,3]。返回1,而且该区间被占用了
2 a len , 表示从单位a開始,清除一段长度为len的区间(将其变为可用。不被占用),不须要输出
ac代码
#include<stdio.h>
#include<string.h>
#define max(a,b) (a>b?a:b)
struct s
{
int ll,rl,ml,cover;
}node[50050<<2];
void build(int l,int r,int tr)
{
node[tr].ll=node[tr].rl=node[tr].ml=r-l+1;
node[tr].cover=-1;
if(l==r)
return;
int mid=(l+r)>>1;
build(l,mid,tr<<1);
build(mid+1,r,tr<<1|1);
}
void pushdown(int tr,int m)
{
if(node[tr].cover!=-1)
{
node[tr<<1].cover=node[tr<<1|1].cover=node[tr].cover;
if(node[tr].cover==0)
{
node[tr<<1].ll=node[tr<<1].rl=node[tr<<1].ml=m-(m>>1);
node[tr<<1|1].ll=node[tr<<1|1].rl=node[tr<<1|1].ml=(m>>1);
}
else
{
node[tr<<1].ll=node[tr<<1].rl=node[tr<<1].ml=0;
node[tr<<1|1].ll=node[tr<<1|1].rl=node[tr<<1|1].ml=0;
}
node[tr].cover=-1;
}
}
void pushup(int tr,int m)
{
node[tr].ll=node[tr<<1].ll;
node[tr].rl=node[tr<<1|1].rl;
if(node[tr].ll==m-(m>>1))
node[tr].ll+=node[tr<<1|1].ll;
if(node[tr].rl==(m>>1))
node[tr].rl+=node[tr<<1].rl;
node[tr].ml=max(node[tr<<1].rl+node[tr<<1|1].ll,max(node[tr<<1].ml,node[tr<<1|1].ml));
}
void update(int L,int R,int l,int r,int tr,int val)
{
if(L<=l&&R>=r)
{
if(val)
{
node[tr].ll=node[tr].rl=node[tr].ml=0;
}
else
node[tr].ll=node[tr].rl=node[tr].ml=r-l+1;
node[tr].cover=val;
return;
}
pushdown(tr,r-l+1);
int mid=(l+r)>>1;
if(L>mid)
{
update(L,R,mid+1,r,tr<<1|1,val);
}
else
if(R<=mid)
{
update(L,R,l,mid,tr<<1,val);
}
else
{
update(L,mid,l,mid,tr<<1,val);
update(mid+1,R,mid+1,r,tr<<1|1,val);
}
/*if(L<=mid)
update(L,R,l,mid,tr<<1,val);
if(R>mid)
update(L,R,mid+1,r,tr<<1|1,val);*/
pushup(tr,r-l+1);
}
int query(int w,int l,int r,int tr)
{
if(l==r)
return l;
pushdown(tr,r-l+1);
int mid=(l+r)>>1;
if(node[tr<<1].ml>=w)
return query(w,l,mid,tr<<1);
else
if(node[tr<<1].rl+node[tr<<1|1].ll>=w)
return mid-node[tr<<1].rl+1;
else
return query(w,mid+1,r,tr<<1|1);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(1,n,1);
while(m--)
{
int op;
scanf("%d",&op);
if(op==1)
{
int a;
scanf("%d",&a);
if(a>node[1].ml)
{
printf("0\n");
continue;
}
int p=query(a,1,n,1);
printf("%d\n",p);
update(p,p+a-1,1,n,1,1);
}
else
{
int a,b;
scanf("%d%D",&a,&b);
update(a,a+b-1,1,n,1,0);
}
}
}
}
POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)的更多相关文章
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】
任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total S ...
- poj 3468 线段树区间更新/查询
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- HDU 1698 Just a Hook(线段树区间更新查询)
描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...
- codevs 1299 线段树 区间更新查询
1299 切水果 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 简单的说,一共N个水果排成 ...
- POJ 3667 Hotel (线段树区间合并)
题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
- 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!
D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
随机推荐
- EditPlus里面自带有更改文件编码的功能
- Android 6.0权限分组
Android系统从6.0开始将权限分为一般权限和危险权限,一般权限指不涉及用户隐私的一些权限,比如Internet权限.危险权限指涉及获取用户隐私的一些操作所需要的权限,比如读取用户地理位置的权限. ...
- 【C++】智能指针简述(四):shared_ptr
在开始本文内容之前,我们再来总结一下,前文内容: 1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾. 2.auto_ptr防止拷贝后析构释放同一块内存,采用& ...
- MySQL——基本安装与使用
基本安装 下载地址:https://dev.mysql.com/downloads/mysql/ 选择解压版本:mysql-5.7.21-winx64.zip 以管理员身份打开cmd(除了安装服务不要 ...
- SDK_列表控件的使用
列表控件的使用 列表控件是通用控件,响应WM_NOTIFY 消息 主要包含了 4 种风格,我们学的是 report 风格 如何设置列表的扩展风格 LVS_EX_GRIDLINES: 列表拥有表格线 L ...
- JAVA基础——文件File简单实用
1.1java.io.File File用于表示文件系统中的一个文件或目录 通过File可以: 1:访问该文件或目录的属性信息(名字,大小,修改时间等) file.getName();获取文件名fil ...
- java学习日志--char和int的相互转换
package shugen; /*ASCLL码表 * 48 数字0 * 49 1 * 50 2 * 51 3 * 52 4 * 53 5 * 54 6 * 55 7 * 56 8 * 57 9 */ ...
- acm学习指引
acm学习心得及书籍推荐 一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划练练: 第 ...
- Java垃圾回收简介
Java关键术语 JavaAPI:一系列帮助开发者创建Java应用程序的封装好的库. Java 开发工具包 (JDK):一系列工具帮助开发者创建Java应用程序.JDK包含工具编译.运行.打包.分发和 ...
- 腾讯云,搭建Http静态服务器环境
任务时间:15min ~ 30min 搭建静态网站,首先需要部署环境.下面的步骤,将告诉大家如何在服务器上通过 Nginx 部署 HTTP 静态服务. 安装 Nginx 在 CentOS 上,可直接使 ...