pku 3667 hotel

原创 2013年12月04日 22:28:20

感觉题目不难啊,就是处理有点烦而已。水过了。pku30题留个纪念。

#include<stdio.h>
#include<iostream>
using namespace std;
const int OTHER = 0;
const int FULL = 1;
const int EMPTY = -1;
const int QUERRY = 1;
const int LEAVE = 2;
const int MAX_N = 50050;
const int MAX_T = MAX_N*2;
const int root = 1;
struct node
{
	int L,R;
	int Lid,Rid;
	int value;
	int Lvalue,Rvalue;
	int tag;
};
struct node T[MAX_T];
int N,M;
int times;
struct node Tmaking(int a,int b,int c,int d,int e,int f,int g,int h)
{
	struct node tmp ;
	tmp.L=a;
	tmp.R=b;
	tmp.Lid=c;
	tmp.Rid=d;
	tmp.value=e;
	tmp.Lvalue=f;
	tmp.Rvalue=g;
	tmp.tag=h;
	return tmp;
}
void Build(int l,int r)
{
	if (l==r) {T[++times]=Tmaking(l,r,-1,-1,1,1,1,OTHER);return ;}
	int mid=(l+r)/2;
	int now=++times;
	int lid=times+1;
	Build(l,mid);
	int rid=times+1;
	Build(mid+1,r);
	T[now]=Tmaking(l,r,lid,rid,r-l+1,r-l+1,r-l+1,OTHER);
}
void init()
{
	scanf("%d %d",&N,&M);
	Build(1,N);
}
void lazy_tag(int t)
{
	if (T[t].tag!=OTHER)
	{	
		int l=T[t].L;
		int r=T[t].R;
		int lid=T[t].Lid;
		int rid=T[t].Rid;
		int mid=(l+r)/2; 
		T[lid].tag=T[rid].tag=T[t].tag;
		T[lid].value=T[lid].Lvalue=T[lid].Rvalue=(T[t].tag==FULL?0:mid-l+1);
		T[rid].value=T[rid].Lvalue=T[rid].Rvalue=(T[t].tag==FULL?0:r-mid);
		T[t].tag=OTHER;
	}
}
void change(int t,int s,int e,int tagf)
{
	int l=T[t].L;
	int r=T[t].R;
	int lid=T[t].Lid;
	int rid=T[t].Rid;
	int mid=(l+r)/2; 
	int atag= (tagf==FULL?0:r-l+1);
	if (s<=l&&e>=r) {T[t]=Tmaking(l,r,lid,rid,atag,atag,atag,tagf);return ;}
	lazy_tag(t);
	if (e<=mid) change(lid,s,e,tagf);
	else if (s>mid) change(rid,s,e,tagf);
	else change(lid,s,mid,tagf),change(rid,mid+1,e,tagf);
	int value = max(T[lid].value,T[rid].value);
	value=max(value,T[lid].Rvalue+T[rid].Lvalue);
	int lvalue = T[lid].Lvalue;
	if (lvalue==mid-l+1) lvalue+=T[rid].Lvalue;
	int rvalue = T[rid].Rvalue;
	if (rvalue==r-mid) rvalue+=T[lid].Rvalue;
	T[t]=Tmaking(l,r,lid,rid,value,lvalue,rvalue,OTHER);
}
int Querry(int t,int room)
{
	if (T[t].value<room) return 0;
	int l=T[t].L;
	int r=T[t].R;
	int lid=T[t].Lid;
	int rid=T[t].Rid;
	int mid=(l+r)/2;
	lazy_tag(t);
	int pos;
	pos=Querry(lid,room);
	if (pos) return pos;
	if (T[lid].Rvalue+T[rid].Lvalue>=room) pos=mid-T[lid].Rvalue+1;
	if (pos) return pos;
	pos=Querry(rid,room);
	if (pos) return pos;
	return 0;
}
void work_put()
{
	int op,a,b,i;
	int pos;
	for (i=1;i<=M;i++)
	{
		scanf("%d",&op);
		if (op==QUERRY)
		{
			scanf("%d",&a);
			pos=Querry(root,a);
			printf("%d\n",pos);
			if (pos) change(root,pos,pos+a-1,FULL);
		}
		if (op==LEAVE)
		{
			scanf("%d %d",&a,&b);
			change(root,a,a+b-1,EMPTY);
		}
	}
}
int main()
{
	init();
	work_put();
	return 0;
}


 

PKU3667(Hotel)线段树

/********************************************** 题目大意: 有一个旅馆,有N个房间排成一排; 现在有两种操作: 第一是有a个顾客要入住连续的a个房间; ...
  • Jarily
  • Jarily
  • 2013年03月07日 16:21
  • 855

POJ 3667 Hotel 线段树区间合并

题意 一开始有1~n个空房间 对应2个操作  i)问有没有连续的长度为x的x间房如果有占满最左边的那个区间,输出这个区间的起点 ii)把区间x~x+y-1的房间清空 一个很明显的区间合并具体...

POJ 3667 Hotel 线段树

Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 11104 Accep...

Poj 3667 Hotel + Hdu 4553 约会安排 (线段树最左空区间)

题目链接:http://poj.org/problem?id=3667 题意:旅馆的N(1 ≤ n ≤ 50,000) 个房间初始时全为空。现在有M(1 ≤ m (1)1  X,要求得到连续的X...

【POJ 3667】Hotel

POJ 3667题意有n个房间和k个操作,最开始全部为空。操作1:输入一个数d,找出连续d个空房间,输出起点房间编号。若有多个输出最小的,如果不存在输出0。操作2:输入两个数x和d,清空从x开始的d个...
  • Ripped
  • Ripped
  • 2017年02月05日 12:21
  • 125

poj3667 Hotel

经典问题,就是线段树[L, R]上保存3个信息,分别表示以L开头最多连续的空格,R为结尾的最多连续空格,这段区间最大的连续空格。然后就可以写代码了。 (为什么我的线段树这么丑) #include us...

poj3667 Hotel(成段更新+区间合并)

http://poj.org/problem?id=3667 题意:给你n个房间,m种操作,1操作为查看有没有连续长度为num的房间,若有,则返回其左端点,并将其置为非空;2操作为置空st~st...

poj3667_Hotel—线段树区间合并

因为用的都是 int64 所以时间没有那么短,换成int的话应该会小于400ms,该方法应该是时间效率最高的方法,理论上比HH的方法快,任何独立操作都在logn时间完成,而且还有优化~ #inclu...
  • zz_1215
  • zz_1215
  • 2011年10月22日 09:19
  • 394

poj 3667 Hotel(线段树区间分配)

Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9550   Accepted...

POJ 3667 - Hotel

Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and...
  • Sureina
  • Sureina
  • 2016年08月29日 19:36
  • 94
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pku 3667 hotel
举报原因:
原因补充:

(最多只允许输入30个字)