Hotel
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 12446   Accepted: 5363

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

代码:

/* ***********************************************
Author :rabbit
Created Time :2014/11/1 12:57:54
File Name :4.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
const int maxn=200200;
struct Node;
Node *null;
struct Node{
Node *ch[2],*fa;
int size;
int lsum,rsum,msum,col,val;
Node(){
ch[0]=ch[1]=fa=null;
col=0;
}
inline void setc(Node *p,int d){
ch[d]=p;
p->fa=this;
}
inline bool d(){
return fa->ch[1]==this;
}
void clear(){
size=1;
ch[0]=ch[1]=fa=null;
lsum=rsum=msum=val=1;
col=-1;
}
inline void push_up(){
if(this==null)return;
size=ch[0]->size+ch[1]->size+1;
lsum=ch[0]->lsum;
rsum=ch[1]->rsum;
msum=max(ch[0]->msum,ch[1]->msum);
if(val){
msum=max(msum,ch[0]->rsum+ch[1]->lsum+1);
if(lsum==ch[0]->size)lsum+=ch[1]->lsum+1;
if(rsum==ch[1]->size)rsum+=ch[0]->rsum+1;
}
}
void update(int c){
if(this==null)return;
lsum=rsum=msum=c*size;
val=col=c;
}
inline void push_down(){
if(this==null)return;
if(col!=-1){
ch[0]->update(col);
ch[1]->update(col);
col=-1;
}
}
};
inline void rotate(Node *x){
Node *f=x->fa,*ff=x->fa->fa;
f->push_down();
x->push_down();
int c=x->d(),cc=f->d();
f->setc(x->ch[!c],c);
x->setc(f,!c);
if(ff->ch[cc]==f)ff->setc(x,cc);
else x->fa=ff;
f->push_up();
}
inline void splay(Node *&root,Node *x,Node *goal){
while(x->fa!=goal){
if(x->fa->fa==goal)rotate(x);
else{
x->fa->fa->push_down();
x->fa->push_down();
x->push_down();
bool f=x->fa->d();
x->d()==f? rotate(x->fa):rotate(x);
rotate(x);
}
}
x->push_up();
if(goal==null)root=x;
}
Node *get_kth(Node *r,int k){
Node *x=r;
x->push_down();
while(x->ch[0]->size+1!=k){
if(k<x->ch[0]->size+1)x=x->ch[0];
else{
k-=x->ch[0]->size+1;
x=x->ch[1];
}
x->push_down();
}
return x;
}
Node pool[maxn],*tail,*node[maxn],*root;
void build(Node *&x,int l,int r,Node *fa){
if(l>r)return;
int mid=(l+r)/2;
x=tail++;
x->clear();
x->fa=fa;
node[mid]=x;
build(x->ch[0],l,mid-1,x);
build(x->ch[1],mid+1,r,x);
x->push_up();
}
void init(int n){
tail=pool;
null=tail++;
null->fa=null->ch[0]=null->ch[1]=null;
null->size=0;
null->val=null->lsum=null->rsum=null->msum=0;null->col=-1;
Node *p=tail++;
p->val=p->msum=p->rsum=p->lsum=0;p->col=-1;
p->size=1;p->ch[0]=p->ch[1]=p->fa=null;
root=p;
p=tail++;
p->val=p->msum=p->rsum=p->lsum=0;p->col=-1;
p->size=1;p->ch[0]=p->ch[1]=p->fa=null;
root->setc(p,1);
build(root->ch[1]->ch[0],1,n,root->ch[1]);
root->ch[1]->push_up();
root->push_up();
}
void update(int l,int r,int c){
splay(root,get_kth(root,l),null);
splay(root,get_kth(root,r+2),root);
root->ch[1]->ch[0]->update(c);
root->ch[1]->push_up();
root->push_up();
}
int query(int l,int r){
splay(root,get_kth(root,l),null);
splay(root,get_kth(root,r+2),root);
return root->ch[1]->ch[0]->msum;
}
int find(Node *x,int k,int pos){
x->push_down();
//cout<<x->msum<<endl;
if(x->ch[0]->msum>=k)return find(x->ch[0],k,pos);
pos+=x->ch[0]->size;
if(x->val&&x->ch[0]->rsum+x->ch[1]->lsum+1>=k)return pos-x->ch[0]->rsum;
return find(x->ch[1],k,pos+1);
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int n,m;
while(~scanf("%d%d",&n,&m)){
init(n);
//cout<<root->msum<<" "<<root->ch[0]->msum<<" "<<root->ch[1]->msum<<endl;
while(m--){
int op,x,y;
scanf("%d",&op);
if(op==1){
scanf("%d",&x);
if(root->msum<x){
puts("0");continue;
}
int k=find(root,x,0);
printf("%d\n",k);
update(k,k+x-1,0);
}
else{
scanf("%d%d",&x,&y);
update(x,x+y-1,1);
}
}
}
return 0;
} /*
int main()
{
int n,m;
while(cin>>n>>m) {
init(n);
while(m--){
int op,x,y,z;
cin>>op;
if(op==1){
cin>>x>>y>>z;
update(x,y,z);
}
else{
cin>>x>>y;
cout<<query(x,y)<<endl;
}
}
}
return 0;
}
*/

版权声明:本文博主原创文章。博客,未经同意不得转载。

POJ 3667 splay区间盘整运动的更多相关文章

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

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  2. POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并

    看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...

  3. POJ 3667 Hotel(线段树)

    POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...

  4. hdu 1890 Robotic Sort(splay 区间反转+删点)

    题目链接:hdu 1890 Robotic Sort 题意: 给你n个数,每次找到第i小的数的位置,然后输出这个位置,然后将这个位置前面的数翻转一下,然后删除这个数,这样执行n次. 题解: 典型的sp ...

  5. 算法模板——splay区间反转 2

    实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没 ...

  6. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  7. POJ 2995 Brackets 区间DP

    POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...

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

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

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

    http://poj.org/problem?id=3667 题意: 有N个房间,M次操作.有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示 ...

随机推荐

  1. 删除链表的中间节点和a/b处节点

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“删除链表的中间节点和a/b处节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说 ...

  2. 条款16:成对使用new和delete时,采取相同的形式

    问题聚焦:     我们都知道,new和delete要成对使用,但是有时候,事情往往不是按我们预期的那样发展.     对于单一对象和对象数组,我们要分开考虑.     遇到typedef时,也需要搞 ...

  3. A Byte of Python 笔记(9) 面向对象编程

    第11章  面向对象编程 面向过程:根据操作数据的函数或语句块来设计程序. 面向对象(OOP, object-oriented programming):把数据和功能结合起来,用对象包裹组织程序. 类 ...

  4. nrf51 SDK自带例程的解读

    简单的pwm电机控制示例 simple_pwm_motor_control_example 其实就是pwm控制led的亮度 1.首先设置gpiote 设置初始为高电平2.接着设置ppi 定时器time ...

  5. SIGAR - System Information Gatherer And Reporter

    https://support.hyperic.com/display/SIGAR/Home 收藏一篇: http://www.cnitblog.com/houcy/archive/2012/11/2 ...

  6. CreateFile,ReadFile等API详解(或者说MSDN的翻译)

    一.*****CreateFile***** 这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:控制台对象.通信资源对象.目录对象(只能打开).磁盘设备对象.文件对象.邮槽对象.管道 ...

  7. MinGW 编译zlib、libpng、libjpeg、libcurl等(全都是Qt项目)

    MinGW 这里使用的是Qt5自带的MinGw版本,将路径D:\Qt\Qt5.1.0\Tools\mingw48_32\bin加到"环境变量"→"系统变量"→& ...

  8. samba服务器上文件名大小写

    samba服务器上文件名大小写 如果给HP_UX配置samba之后,通过windows访问有时候会发现文件名大小写不对时,请注意下述配置信息是否正确.在/etc/opt/samba/smb.conf中 ...

  9. Microsoft Accelerator for Windows Azure Alum Azuqua 今天启动

     云最大的一个优势就是,它使开发人员比以往任何时候都更迅速.更灵活.在 Windows Azure 中开发应用程序时,工程师无需考虑架设服务器.规划容量或进行日常维护.相反,他们可以专注于提出假设 ...

  10. 第一个Django项目及部署到Sina App Engine

    Sina App Engine简称SAE,是个比较好的网站托管平台,目前说是全面免费,其实就是每个人分配很小的资源配额,在一定的使用范围内不用消耗云豆(SAE计费方式),对于个人学习和研究足够了,同类 ...