洛谷P2894 [USACO08FEB]酒店Hotel
P2894 [USACO08FEB]酒店Hotel
https://www.luogu.org/problem/show?pid=2894
题目描述
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.
奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光。作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿。这个巨大的旅馆一共有N (1 <= N <= 50,000)间客房,它们在同一层楼中顺次一字排开,在任何一个房间里,只需要拉开窗帘,就能见到波光粼粼的湖面。 贝茜一行,以及其他慕名而来的旅游者,都是一批批地来到旅馆的服务台,希望能订到D_i (1 <= D_i <= N)间连续的房间。服务台的接待工作也很简单:如果存在r满足编号为r..r+D_i-1的房间均空着,他就将这一批顾客安排到这些房间入住;如果没有满足条件的r,他会道歉说没有足够的空房间,请顾客们另找一家宾馆。如果有多个满足条件的r,服务员会选择其中最小的一个。 旅馆中的退房服务也是批量进行的。每一个退房请求由2个数字X_i、D_i 描述,表示编号为X_i..X_i+D_i-1 (1 <= X_i <= N-D_i+1)房间中的客人全部离开。退房前,请求退掉的房间中的一些,甚至是所有,可能本来就无人入住。 而你的工作,就是写一个程序,帮服务员为旅客安排房间。你的程序一共需要处理M (1 <= M < 50,000)个按输入次序到来的住店或退房的请求。第一个请求到来前,旅店中所有房间都是空闲的。
输入输出格式
输入格式:
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
输出格式:
- 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.
参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作:
若i为1,表示查询房间,再输入一个数x,表示在1--n 房间中找到长度为x的连续空房,输出连续x个房间中左端的房间号,尽量让这个房间号最小,若找不到长度为x的连续空房,输出0。
若i为2,表示退房,再输入两个数 x,y 代表 房间号 x---x+y-1 退房,即让房间为空。
输入输出样例
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
1
4
7
0
5
区间最长连续空位,类似最大子段和 最大子段和:http://www.cnblogs.com/TheRoadToTheGold/p/6360224.html
但这里区间合并更新max_l时,要判断左区间的sum是否等于max,跟最大子段和不一样
max_r同理
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,p,x,y,opl,opr;
struct node
{
int l,r,max,max_l,max_r,sum,flag;
}e[*];
void build(int k,int l,int r)
{
e[k].l=l;e[k].r=r;
e[k].sum=e[k].max=e[k].max_l=e[k].max_r=r-l+;
if(l==r) return;
int mid=l+r>>;
build(k<<,l,mid);build((k<<)+,mid+,r);
}
void down(int k)
{
e[k<<].flag=e[(k<<)+].flag=e[k].flag;
if(e[k].flag==)
e[k<<].max=e[k<<].max_l=e[k<<].max_r=e[(k<<)+].max=e[(k<<)+].max_l=e[(k<<)+].max_r=;
else
{
e[k<<].max=e[k<<].max_l=e[k<<].max_r=e[k<<].sum;
e[(k<<)+].max=e[(k<<)+].max_l=e[(k<<)+].max_r=e[(k<<)+].sum;
}
e[k].flag=;
}
int ask(int k)
{
if(e[k].l==e[k].r) return e[k].l;
if(e[k].flag) down(k);
if(e[k<<].max>=x) return ask(k<<);
int mid=e[k].l+e[k].r>>;
if(e[(k<<)+].max_l+e[k<<].max_r>=x) return mid-e[k<<].max_r+;
return ask((k<<)+);
}
void up(int k)
{
e[k].max=max(max(e[k<<].max,e[(k<<)+].max),e[k<<].max_r+e[(k<<)+].max_l);
if(e[k<<].sum==e[k<<].max) e[k].max_l=e[k<<].sum+e[(k<<)+].max_l;
else e[k].max_l=e[k<<].max_l;
if(e[(k<<)+].sum==e[(k<<)+].max) e[k].max_r=e[(k<<)+].sum+e[k<<].max_r;
else e[k].max_r=e[(k<<)+].max_r;
}
void change(int k,int f)
{
if(e[k].l>=opl&&e[k].r<=opr)
{
if(f==)
{
e[k].max=e[k].max_l=e[k].max_r=;
e[k].flag=;
return;
}
else
{
e[k].max=e[k].max_l=e[k].max_r=e[k].sum;
e[k].flag=;
return;
}
}
if(e[k].flag) down(k);
int mid=e[k].l+e[k].r>>;
if(opr<=mid) change(k<<,f);
else if(opl>mid) change((k<<)+,f);
else
{
change(k<<,f);
change((k<<)+,f);
}
up(k);
}
int main()
{
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<=m;i++)
{
scanf("%d",&p);
if(p==)
{
scanf("%d",&x);
if(e[].max<x) printf("0\n");
else
{
opl=ask();
printf("%d\n",opl);
opr=opl+x-;
change(,);
}
}
else
{
scanf("%d%d",&opl,&y);
opr=opl+y-;
change(,);
}
}
}
自己做区间查询写不出来
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,p,x,y,ans,ok;
struct node
{
int l,r,start,max,max_l,max_r;
}e[*];
void build(int k,int l,int r)
{
e[k].l=l,e[k].r=r;
e[k].max=r-l+;
e[k].max_l=r-l+;
e[k].max_r=r-l+;
if(l==r) return;
int mid=l+r>>;
build(k<<,l,mid);
build((k<<)+,mid+,r);
}
void ask(int k,int &longg,int & long_l,int & long_r)
{
if(!e[k].max) return;
if(e[k<<].max>=x)
{
if(ans>e[k<<].start)
{
anse[k<<].start;
ask(k<<);
}
}
int mid=e[k].l+e[k].r>>;
else if(e[(k<<)+].max>=x)
{
if(ans>e[(k<<)+].start)
{
ans=ans,e[(k<<)+].start;
ask((k<<)+);
}
} }
int main()
{
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<=m;i++)
{
scanf("%d",&p);
if(p==)
{
scanf("%d",&x);
ans=0x7fffffff,ok=true;
int longg=,long_l=,long_r=;
ask(,longg,long_l,long_r);
}
}
}
思维定势的错误的区间查询代码
洛谷P2894 [USACO08FEB]酒店Hotel的更多相关文章
- 洛谷 P2894 [USACO08FEB]酒店Hotel 解题报告
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...
- 洛谷P2894 [USACO08FEB]酒店Hotel [线段树]
题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...
- 洛谷 P2894 [USACO08FEB]酒店Hotel
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...
- 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel
https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...
- 洛谷P2894[USACO08FEB]酒店Hotel(线段树)
问题描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- 洛谷 P2894 [USACO08FEB]酒店Hotel-线段树区间合并(判断找位置,不需要维护端点)+分治
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...
- 洛谷P2894 [USACO08FEB]酒店Hotel_区间更新_区间查询
Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...
- 洛谷 P2894 [USACO08FEB]酒店
题目描述 用线段树维护三个值:区间最长空位长度,从左端点可以延伸的最长空位长度,从右端点可以延伸的最长空位长度. #include<complex> #include<cstdio& ...
- 线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间 ...
随机推荐
- 可重复执行的SQL Script
问题 在工作中偶尔会遇到这样的问题:SQL script重复执行时会报错. 理想的状态下,SQL script跑一遍就够了,是不会重复执行的,但是实际情况往往很复杂. 比如Dev同学在开发时在A环境把 ...
- 【NOIP2016】【CJOJ2257】2257 愤怒的小鸟
题目 Description https://www.luogu.org/problem/show?pid=2831 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行 ...
- 【NOI2014】起床困难综合症(贪心)
[NOI2014]起床困难综合症(贪心) 题面 Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚 ...
- SIMD---MMX代码优化
单指令多数据流,即SIMD(Single Instruction, Multiple Data)指一类能够在单个指令周期内同时处理多个数据元素的指令集,利用的是数据级并行来提高运行效率,典型的代表由I ...
- MyBatis笔试题
1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="UTF-8"? ...
- 关于del命令
del命令用于删除具体的文件,但是删除文件的时候如果不指定文件的扩展名就会显示找不到文件 还有如果所要删除文件的文件名中含有空格的话该命令会自动识别为几个文件,就从空格处把文件 分成几份,然后就会显示 ...
- XIB中拖UIScrollView的困难
最近在开发中有一个移植代码的工作,但是呢那块代码是n多年前写的,虽然还没看时就感觉到坑不小,到真正看的时候才发现是个陨石坑.具体的说呢,所有的界面都是xib托的而且没用Auto Layout约束,而且 ...
- 纯js生成验证码
实现代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"& ...
- 功能性AI术语表
算法:一套计算机要遵循的指令.一个算法可以是一个简单的单步程序也可以是一个复杂的神经网络,但是通常被用来指一个模型. 人工智能:这是一个统称.广义上说,软件意味着模仿或取代人类智能的各个方面.人工智能 ...
- videojs双击全屏幕观看,videojs动态加载视频
前段时间闲来无事弄了弄video.js,感觉蛮好玩,能应用到各个应用端,自己在最后玩耍的时候,需要注意的只剩下两方面了,1,动态加载播放视频内容2,双击全屏观看, var urlRoad = &quo ...