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 ≤
XiN-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

USACO 2008 February Gold

题意:有一个线段,从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(线段树,区间更新查询,求连续区间)的更多相关文章

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

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  2. POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】

    任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. poj 3468 线段树区间更新/查询

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  4. 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 ...

  5. codevs 1299 线段树 区间更新查询

    1299 切水果  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 简单的说,一共N个水果排成 ...

  6. POJ 3667 Hotel (线段树区间合并)

    题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...

  7. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  8. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  9. 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!

    D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...

  10. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

随机推荐

  1. java死锁问题

    一.先从定义上了解一下死锁 二.从代码角度上去解释一下死锁问题 三.上述程序就是出现了死锁,我们来查看一下 1.命令如下   cmd>>jps(查看到了死锁线程所在的类,前面是PID) 2 ...

  2. 计算型属性 vs 懒加载

    只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性 计算型属性本身不占用内存空间 不可以给计算型属性设置数值 计算型属性可以使用以下代码简写 var titl ...

  3. 安卓app测试之Monkeyrunner

    一.MonkeyRunner简介 MonkeyRunner提供了系列的API ,MonkeyRunner可以完成模拟事件及截图操作 ,分为以下三类: MonkeyRunner:用来连接设备或模拟器的 ...

  4. 还没更换RubyGems镜像?

    相信用过Ruby的人都知道 gem install 命令,但是在国内该命令安装的速度甚是不稳定(你懂的),导致尝试数次便是等待数时,记得之前在安装redmine的时候便是如此,之前不懂什么意思,还以为 ...

  5. 在MONO Design中使用Flex3D

    在项目开发组的努力下,HTML5 3D 的开发包变得越来越优秀,越来越健壮:基于HTML5 3D技术的MONO Design建模平台功能也变得越来越强大和完善,这个方便了很多使用我们HTML5 3D的 ...

  6. P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)

    先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1​<...<Ti​和Ti​>Ti+1​>…>TK​可以看出这题涉及最长上升子序列和最长下降子序列 2 ...

  7. springboot+idea+jsp 404问题

    我是这么解决的 对于单一项目,加入以下jar包即可. <!--前台页面的支持--> <dependency> <groupId>javax.servlet</ ...

  8. 杂文Python

    2.文件操作 文件操作的过程:打开文件获得句柄——>操作文件行(遍历等)——>关闭文件 打开文件获得句柄 比较low的方法: f = open("file_path", ...

  9. Extract local angle of attack on wind turbine blades

    Extract local angle of attack on wind turbine blades Table of Contents 1. Extract local angle of att ...

  10. Spring Tool Suite 安装

    第一步:到http://spring.io/tools/sts/all/上下载对应版本.(此处以博主Windows64位系统为例) 第二步: 进入eclipse,依次点击help-->Insta ...