Hotel(线段树合并)
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 14958 | Accepted: 6450 |
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
题解:
Hotel有N(1 ≤ N ≤ 50,000)间rooms,并且所有的rooms都是连续排列在同一边,groups需要check in 房间,
要求房间的编号为连续的r..r+Di-1并且r是最小的;visitors同样可能check out,
并且他们每次check out都是编号为Xi ..Xi +Di-1 (1 ≤ Xi ≤ N-Di+1)的房间,题目的输入有两种样式:
- 1 a : groups需要check in a间编号连续的房间
- 2 a b : visitors check out 房间,其中房间编号是 a…a+b-1
要求对于每次request,输出为groups分配数目为a的房间中编号最小的房间编号
利用线段树建立模型,维护最大连续区间长度,其中区间长度就是对应的房间数目,并且对应区间中最左边的断点就是answer,
同时因为需要求出连续区间的最大长度,因此每次PushUp时都将左右区间合并,
lsum维护左区间的最大长度,rsum维护右区间的最大长度,sum维护区间1…N中的最大连续区间长度,lazy延迟标记;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define SD(x,y) scanf("%lf%lf",&x,&y)
#define P_ printf(" ")
#define ll root<<1
#define rr root<<1|1
#define lson ll,l,mid
#define rson rr,mid+1,r
typedef long long LL;
const int MAXN=50010<<2;
int sum[MAXN],lsum[MAXN],rsum[MAXN];
int lazy[MAXN];
void pushdown(int root,int v){
if(lazy[root]!=-1){
lazy[ll]=lazy[rr]=lazy[root];
sum[ll]=lsum[ll]=rsum[ll]=lazy[root]?0:v-(v>>1);
sum[rr]=lsum[rr]=rsum[rr]=lazy[root]?0:v>>1;
lazy[root]=-1;
}
}
void pushup(int root,int v){
lsum[root]=lsum[ll];
rsum[root]=rsum[rr];
if(lsum[root]==v-(v>>1))lsum[root]+=lsum[rr];
if(rsum[root]==(v>>1))rsum[root]+=rsum[ll];
sum[root]=max(lsum[rr]+rsum[ll],max(sum[ll],sum[rr]));
}
void build(int root,int l,int r){
int mid=(l+r)>>1;
sum[root]=lsum[root]=rsum[root]=r-l+1;
lazy[MAXN]=-1;
if(l==r)return;
build(lson);
build(rson);
}
void update(int root,int l,int r,int A,int B,int c){
if(l>=A&&r<=B){
lazy[root]=c;
sum[root]=lsum[root]=rsum[root]=c?0:r-l+1;
return;
}
pushdown(root,r-l+1);
int mid=(l+r)>>1;
if(mid>=A)update(lson,A,B,c);
if(mid<B)update(rson,A,B,c);
pushup(root,r-l+1);
}
int query(int root,int l,int r,int v){
if(l==r)return l;
pushdown(root,r-l+1);
int mid=(l+r)>>1;
if(sum[ll]>=v)return query(lson,v);
else if(lsum[rr]+rsum[ll]>=v)return mid-rsum[ll]+1;
else return query(rson,v);
}
int main(){
int N,M;
while(~scanf("%d%d",&N,&M)){
build(1,1,N);
int a,b,c;
while(M--){
SI(a);SI(b);
if(a==1){
if(sum[1]<b){
puts("0");continue;
}
int ans=query(1,1,N,b);
printf("%d\n",ans);
update(1,1,N,ans,ans+b-1,1);//询问完毕需要更新上;
}
else{
SI(c);
update(1,1,N,b,b+c-1,0);
}
}
}
return 0;
}
Hotel(线段树合并)的更多相关文章
- [USACO08FEB]酒店Hotel 线段树
[USACO08FEB]酒店Hotel 线段树 题面 其实就是区间多维护一个lmax,rmax(表示从左开始有连续lmax个空房,一直有连续rmax个空房到最右边),合并时讨论一下即可. void p ...
- [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- BZOJ 3307: 雨天的尾巴( LCA + 线段树合并 )
路径(x, y) +z : u处+z, v处+z, lca(u,v)处-z, fa(lca)处-z, 然后dfs一遍, 用线段树合并. O(M log M + M log N). 复杂度看起来不高, ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)
[bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...
- bzoj3702二叉树 线段树合并
3702: 二叉树 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 600 Solved: 272[Submit][Status][Discuss] ...
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
随机推荐
- Html.ActionLink("linkText","actionName")
一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, ...
- DELPHI 任务栏无EXE显示
需要用到的一个函数: LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong ); program Project; usesForms, ...
- 外网如何访问本地tomcat web服务器【转】
转自:http://jingpin.jikexueyuan.com/article/49159.html 外网如何访问本地tomcat web服务器 作者: XHKJOE 发布时间:2015-07-1 ...
- Spring、XML配置AOP
新建一个AOP类: public class MyInterceptor2 { public void doAccessCheck(){ System.out.println("前置通知 & ...
- 关于JPA多数据源的部署persistence.xml文件配置以及对应实现类注入
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http: ...
- java中int和Integer的区别
Integer与int的种种比较你知道多少? 转载自http://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html 如果面试 ...
- [C++空间分配]new运算符、operator new、placement new的区别于联系
先科普一下: 1. new的执行过程: (1)通过operator new申请内存 (2)使用placement new调用构造函数(内置类型忽略此步) (3)返回内存指针 2. new和malloc ...
- ecshop开发日志之手机端虚拟商品自动发货
在ecshop官方模版收,web端的虚拟商品购买后不能像pc端那般直接在付款后出现虚拟商品的卡号,密码,截止日期一下为让手机购买也可以在付款后自动显示发货并能显示卡号密码截止日期首 先找到pc端的fl ...
- OpenCV学习 4:摄像头视频读写与边缘检测
原创文章,欢迎转载,转载请注明出处 想实现人脸识别,车辆识别,车牌识别.一般我们可不是读硬盘里面的视频文件的,都是直接从摄像头读取视频流然后直接识别的.所以读取摄像头的视频流这是基础...OpenCV ...
- HTML5学习笔记之Input类型
Input类型——email email类型用于包含email地址的输入域,在输入地址时会自动验证email域的值 例:Email:<input type="email" n ...