Hotel---poj3667(线段树区间问题)
题目链接:http://poj.org/problem?id=3667
题意:酒店有n个房间,现有m个团队,每个团队需要连续 d 个房间,现在有两个操作,1:需要 d 个房间,2:从 x 开始连续 d 个房间退房;
当是1的时候,需要d个房间时, 我们尽可能的找到最靠左的房间给客人,输出最左边房间的编号;
简化一下就是当是1时,让连续的最左边的区间覆盖,2时让对应的区间释放;
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; #define INF 0xfffffff
#define N 50050
#define Lson r<<1
#define Rson r<<1|1 struct SegmentTree
{
int L, R, flag;///flag 表示整个操作的是覆盖1还是释放覆盖2,还是保持原样0;
int lsum, rsum, sum;
///lsum区间左边(从L开始)连续最大不被覆盖的值
///rsum区间右边(到R介绍)连续最大不被覆盖的值
///sum整个区间连续最大不被覆盖的值
int Mid() { return (L+R)>>1;}
int len() { return R-L+1; } } a[N<<2]; void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R, a[r].flag = 0;
a[r].lsum = a[r].rsum = a[r].sum = a[r].len(); if(L == R)return ; Build(Lson, L, a[r].Mid());
Build(Rson, a[r].Mid()+1, R);
}
void Up(int r)
{
a[r].lsum = a[Lson].lsum;
a[r].rsum = a[Rson].rsum;///左右区间由下面的左右区间决定; if(a[r].lsum == a[Lson].len())///当超过区间所在长度时,加上相邻的那部分;
a[r].lsum += a[Rson].lsum;
if(a[r].rsum == a[Rson].len())
a[r].rsum += a[Lson].rsum; a[r].sum = max(a[Lson].rsum + a[Rson].lsum, max(a[Lson].sum, a[Rson].sum));///总的最大值是这三部分的最大值;
} void Down(int r)
{
if(a[r].L != a[r].R && a[r].flag)
{
a[Lson].lsum = a[Lson].rsum = a[Lson].sum = (a[r].flag == 1 ? 0 : a[Lson].len());
a[Rson].lsum = a[Rson].rsum = a[Rson].sum = (a[r].flag == 1 ? 0 : a[Rson].len()); a[Lson].flag = a[Rson].flag = a[r].flag;
a[r].flag = 0;
}
}
void Update(int r, int L, int R, int flag)
{
Down(r);///向下更新; if(a[r].L == L && a[r].R == R)
{
a[r].lsum = a[r].rsum = a[r].sum = (flag == 1 ? 0 : a[r].len());
a[r].flag = flag;
return ;
} ///更新子区间;
if(R <= a[r].Mid())
Update(Lson, L, R, flag);
else if( L > a[r].Mid())
Update(Rson, L, R, flag);
else
{
Update(Lson, L, a[r].Mid(), flag);
Update(Rson, a[r].Mid()+1, R, flag);
}
Up(r);///当下面发生改变改变的时候需要更新上面区间的;
} int Query(int r, int num)
{
///查询是按照从左到右的顺序来的
if(a[r].lsum >= num) return a[r].L;///最左边的;
if(a[Lson].sum >= num) return Query(Lson, num);///左区间;
if(a[Lson].rsum + a[Rson].lsum >= num)///中间区间;
return a[Lson].R-a[Lson].rsum+1;
return Query(Rson, num);///右区间;
} int main()
{
int n, m, op, L, d;
while(scanf("%d %d", &n, &m) != EOF)
{
Build(1, 1, n);
while(m--)
{
scanf("%d", &op);
if(op == 1)
{
scanf("%d", &d);
if(a[1].sum < d)
{
printf("0\n");
continue;
}
L = Query(1, d);
printf("%d\n", L); Update(1, L, L+d-1, 1);///更新从L开始的连续d个点让他们被覆盖;
}
else
{
scanf("%d %d", &L, &d);
Update(1, L, L+d-1, 2);///更新从L开始的连续d个点让他们不被覆盖;
}
}
}
return 0;
}
Hotel---poj3667(线段树区间问题)的更多相关文章
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- Poj 3667——hotel——————【线段树区间合并】
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13124 Accepted: 5664 Descriptio ...
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- POJ 3667 Hotel(线段树+区间合并)
http://poj.org/problem?id=3667 题意: 有N个房间,M次操作.有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示 ...
- poj3667(线段树区间合并&区间查询)
题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...
- POJ 3667 Hotel (线段树区间合并)
题目链接:http://poj.org/problem?id=3667 题目大意:一共有n个房间,初始时都是空的,现在有m个操作,操作有以下两种: 1.1 d :询问是否有连续d个空的房间,若有则输出 ...
- (简单) POJ 3667 Hotel,线段树+区间合并。
Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
随机推荐
- 转载:【原译】Erlang构建和匹配二进制数据(Efficiency Guide)
转自:http://www.cnblogs.com/futuredo/archive/2012/10/19/2727204.html Constructing and matching binarie ...
- 根据PV量来确定需要进行压测的并发量
在实际做压力测试的过程中,我们有时不知道用怎样的并发量比较好,下面是几个用PV量去确定并发量的公式,这个在我们公司是比较适用的,大家可以根据自己的业务进行运算. 方法一:这个方法是我在网上查到的80- ...
- Ubuntu 13.04 安装 Oracle11gR2
#step 1: groupadd -g 2000 dbauseradd -g 2000 -m -s /bin/bash -u 2000 griduseradd -g 2000 -m -s /bin/ ...
- 实例教程Unity3D单例模式(二)自我包括法
unity3d 里的单例模式自我包括法 有一次玩Trench Run game,我意识到我的场景类里存在很多的GameObject.所以,我开发了自我包括的单例.假设没找找到实例,就会创建它自己的Ga ...
- wsdl.exe的用法与参数说明
wsdl.exe的用法与参数说明 打开.net自己带的Visual Studio .NET 2003或 2005 命令提示 输入 wsdl /language:VB /n:mynamespace /o ...
- Swift-基础语法之变量&常量&元组
使用 let来声明一个常量,用 var来声明一个变量.常量的值在编译时并不要求已知,但是你必须为其赋值一次.这意味着你可以使用常量来给一个值命名,然后一次定义多次使用 myVariable = let ...
- web服务器http.server 【python】
参考博客: http://lxneng.iteye.com/blog/492063 http://www.cnblogs.com/itech/archive/2011/12/31/2308697.ht ...
- LeetCode——First Bad Version
Description: You are a product manager and currently leading a team to develop a new product. Unfort ...
- LeetCode——Search for a Range
Description: Given a sorted array of integers, find the starting and ending position of a given targ ...
- $.when()方法监控ajax请求获取到的数据与普通ajax请求回调获取到的数据的不同
1.$.when(ajax).done(function(data)}); 2.$.ajax().done(function(data){}); 1中的data被封装进一个对象[data, " ...