Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 11495 | Accepted: 4949 |
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
题意:
给出 n (0 ~ 50000)和 m(0 ~ 50000),代表有 N 个房间, M 个入住情况,后给出 M 个入住情况,1 代表要入住,2 代表有退房,1 后跟着一个数 num,代表要入住连续 num 间,2 后跟着两个数 ans,num,代表有 ans 这间房间开始,连续退掉 num 间房间。每个 1 操作对应输出一个数,每次入住都要找到最靠左的连续区间,且输出第一个序号,如果不满足则输出 0。
思路:
线段树 + 区间合并。用 0 代表房间为空,1 代表房间为满,同时开数组 lmax(代表区间的左边界开始的最大的连续房间数),rmax(代表区间的右边界开始的最大连续的房间数),mmax(代表整个区间的最大连续块)。看 push_up 的代码:
void push_up(int node, int l, int r) { int mid = (r + l) >> 1; lmax[node] = lmax[node << 1]; //左边界最大等于左儿子的左边界最大 rmax[node] = rmax[node << 1 | 1]; //右边界最大等于右儿子的右边界最大 if (lmax[node] == mid - l + 1) lmax[node] += lmax[node << 1 | 1]; //若刚好等于左儿子整个区间,则还需加上右儿子的左最大 if (rmax[node] == r - mid) rmax[node] += rmax[node << 1]; //若刚好等于右儿子整个区间,则还需加上左儿子的右最大 mmax[node] = max(rmax[node << 1] + lmax[node << 1 | 1], max(mmax[node << 1], mmax[node << 1 | 1])); //最大值,要不是左儿子最大,要不是右儿子最大,要不是中间部分最大 }
再看询问操作:
首先访问左区间,再来访问中间段,最后访问右区间。
int query (int node, int l, int r, int num) { if (l == r) return l; push_down(node, l, r); int mid = (r + l) >> 1; if (mmax[node << 1] >= num) //比较的是左儿子的最大值 return query(node << 1, l, mid, num); else if (rmax[node << 1] + lmax[node << 1 | 1] >= num) return mid - rmax[node << 1] + 1; return query(node << 1 | 1, mid + 1, r, num); }
AC:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAX = 50005; int hotel[MAX * 10]; int mmax[MAX * 10], lmax[MAX * 10], rmax[MAX * 10]; void push_down(int node, int l, int r) { if (hotel[node] != -1) { hotel[node << 1] = hotel[node << 1 | 1] = hotel[node]; int mid = (r + l) >> 1; mmax[node << 1] = rmax[node << 1] = lmax[node << 1] = (hotel[node] ? 0 : mid - l + 1); mmax[node << 1 | 1] = lmax[node << 1 | 1] = rmax[node << 1 | 1] = (hotel[node] ? 0 : r - mid); hotel[node] = -1; } } void push_up(int node, int l, int r) { int mid = (r + l) >> 1; lmax[node] = lmax[node << 1]; rmax[node] = rmax[node << 1 | 1]; if (lmax[node] == mid - l + 1) lmax[node] += lmax[node << 1 | 1]; if (rmax[node] == r - mid) rmax[node] += rmax[node << 1]; mmax[node] = max(rmax[node << 1] + lmax[node << 1 | 1], max(mmax[node << 1], mmax[node << 1 | 1])); } void build (int node, int l, int r) { if (l == r) { hotel[node] = -1; mmax[node] = lmax[node] = rmax[node] = r - l + 1; } else { int mid = (r + l) >> 1; build (node << 1, l, mid); build (node << 1 | 1, mid + 1, r); hotel[node] = -1; push_up(node, l, r); } } void update (int node, int l, int r, int il, int ir, int s) { if (il > r || ir < l) return; if (il <= l && ir >= r) { hotel[node] = s; mmax[node] = lmax[node] = rmax[node] = (s ? 0 : r - l + 1); return; } push_down(node, l, r); int mid = (r + l) >> 1; update(node << 1, l, mid, il, ir, s); update(node << 1 | 1, mid + 1, r, il, ir, s); push_up(node, l, r); } int query (int node, int l, int r, int num) { if (l == r) return l; push_down(node, l, r); int mid = (r + l) >> 1; if (mmax[node << 1] >= num) return query(node << 1, l, mid, num); else if (rmax[node << 1] + lmax[node << 1 | 1] >= num) return mid - rmax[node << 1] + 1; return query(node << 1 | 1, mid + 1, r, num); } int main() { int n, m; scanf("%d%d", &n, &m); build (1, 1, n); while (m--) { int way; scanf("%d", &way); if (way == 1) { int num; scanf("%d", &num); if (mmax[1] < num) { puts("0"); continue; } int in = query(1, 1, n, num); printf("%d\n", in); update(1, 1, n, in, in + num - 1, 1); } else { int f, num; scanf("%d%d", &f, &num); update(1, 1, n, f, f + num - 1, 0); } } return 0; }
相关推荐
springboot 毕设hotel +mysql springboot 毕设hotel +mysqlspringboot 毕设hotel +mysqlspringboot 毕设hotel +mysqlspringboot 毕设hotel +mysqlspringboot 毕设hotel +mysqlspringboot 毕设hotel +mysqlspringboot...
springboot+mysql 毕设hotel springboot+mysql 毕设hotel springboot+mysql 毕设hotel springboot+mysql 毕设hotel springboot+mysql 毕设hotel springboot+mysql 毕设hotel springboot+mysql 毕设hotel springboot+...
本报告关注的是中国在线酒店预订行业在2018年第二季度的发展概况,由Trustdata公司制作发布。报告详细分析了行业动态、竞争格局以及预订趋势,并基于Trustdata的移动大数据监控平台的研究数据。...
myhotel部分代码 +C++ myhotel部分代码 myhotel部分代码 myhotel部分代码 myhotel部分代码 myhotel部分代码 myhotel部分代码
【标题】"Hotel System_hotelsystem_java_hotel_" 指的是一款基于Java语言开发的酒店管理系统,主要用于连接SQL Server数据库,实现酒店日常运营的信息化管理。这个系统可能包括预订管理、入住登记、退房处理、客房...
【标题】"Hotel+厨师、服务员.zip"是一个针对初学Java学者设计的项目,它结合了酒店管理和餐饮人员的角色,提供了实践SSM(Spring、SpringMVC、MyBatis)框架学习的机会。在这个项目中,你可以了解到如何在实际场景...
酒店数据tb-hotel表
hotel数据库Mycle源文件
本项目“Hotel_Online”是一个适合初学者实践的典型示例,它利用了Java开发中的jsp、servlet和jdbc等核心技术,涵盖了订单管理、客户入住、退房等一系列基本功能。 首先,我们来深入理解jsp(JavaServer Pages)...
hotel的源代码,我试过可以Accepted
【标题】:“C# HOTEL2 C# HOTEL2” 【描述】:“C# HOTEL2 是一个基于C#编程语言开发的酒店管理系统项目。它可能涵盖了酒店日常运营中的多种功能,例如客房管理、预订系统、入住登记、账单结算等。通过C#的面向...
【标题】"hotel-order.rar_hotel_hotel_order_order_预定" 暗示这是一个与酒店预订相关的完整网站程序,可能包含一系列用于管理酒店预订流程的软件组件和功能。这个压缩包可能包括前端用户界面、后台管理系统、...
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。...【项目质量】:所有源码都经过严格测试,可以直接...
本项目名为"hotel简单项目代码",是一个初步的酒店预订管理系统的实现。这个项目虽然简洁,但涵盖了基本的预订、退订和查询功能,旨在为初学者提供一个理解Java编程语言以及如何构建简单业务逻辑系统的实践平台。该...
需要数据集可以去kaggle网站搜hotel_bookings.csv下载,代码还待完善,下一篇会总结一些pandas和numpy的函数调用方法和数据可视化的方法,适合小白。
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。...【项目质量】:所有源码都经过严格测试,可以直接...
【标题】"Hotel_Aplication.rar_hotel" 提供的是一个酒店管理应用程序,可能是用于协助酒店日常运营,包括客房管理、预订系统、客户信息管理等多个方面。从文件名来看,这个应用可能包含以下核心组成部分: 1. **...
《酒店管理系统S1Hotel——构建高效运营的核心工具》 在当今信息化时代,酒店管理系统的存在对于提升酒店服务质量和运营效率至关重要。"S1Hotel"作为一款酒店管理系统,它集成了预订、入住、退房、客房管理、财务...