关闭

pku 3667 hotel

276人阅读 评论(0) 收藏 举报
分类:

感觉题目不难啊,就是处理有点烦而已。水过了。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;
}


 

0
0
猜你在找
【直播】计算机视觉原理及实战——屈教授
【套餐】深度学习入门视频课程——唐宇迪
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】机器学习之凸优化——马博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:39914次
    • 积分:1200
    • 等级:
    • 排名:千里之外
    • 原创:87篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    最新评论