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块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
随机推荐
- 360 你妈妈知道你跟Python存在兼容问题吗?
最近在用Python2.7.6版本开发的的过程中发现了一个问题 提示:UnicodeDecodeError:'ascii' codec can't decode bytes 0xb0 刚开始以为是编码 ...
- 动态设置缩放比例和html字体大小
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- POJ_2195_Going Home
题意:用'H','m','.'作出矩阵,'H'代表房子,'m'代表人,人一次只能水平或者垂直移动到相邻的点,问所有人一共走的步数的最小值. 分析:明显的求二分图最大权匹配.KM算法求得的是最大权匹配, ...
- Jmeter之JDBC请求参数化(一)
一.环境准备 a.jmeter5.1.1版本最新版本,可以去网页下载:https://jmeter.apache.org/download_jmeter.cgi b.jdbc驱动:链接:https:/ ...
- PhpStorm 本地管理提交码云和GitHub代码仓库
参考地址:https://www.yflad.cn/1766.html 1:下载Git客户端 2:打开PhpStorm,设置,Version Control → Git.配置git执行文件的路径.gi ...
- MySQL:INSERT ... UPDATE
在 INSERT 语句末尾指定ON DUPLICATE KEY UPDATE时,如果插入的数据会导致表中的 UNIQUE 索引或 PRIMARY KEY 出现重复值,则会对导致重复的数据执行 UPDA ...
- oracle 内连接 左外连接 右外连接的用法,(+)符号用法
1. 内连接很简单 select A.*, B.* from A,B where A.id = B.id select A.*, B.* from A inner join B on A.id = B ...
- Linux基本文件类型
Linux基本文件类型 基本文件类型 - : 普通文件 d : 文件目录 p : 管道文件 l : 软连接文件 c : 字符设备文件 s : socket文件
- 通过response对象的sendRedirect方法重定向网页
通过response对象的sendRedirect方法重定向网页 制作人:全心全意 使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面.重定向操作支持将地址重定 ...
- python之cookbook-day02
第一章:数据结构和算法 1.2 解压可迭代对象赋值给多个变量 问题: 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可迭代对象中解压出 N 个元素 ...