题目链接: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(线段树区间问题)的更多相关文章

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

    poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...

  2. Poj 3667——hotel——————【线段树区间合并】

    Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13124   Accepted: 5664 Descriptio ...

  3. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  4. 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并

    题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...

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

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

  6. poj3667(线段树区间合并&区间查询)

    题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...

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

    题目链接:http://poj.org/problem?id=3667 题目大意:一共有n个房间,初始时都是空的,现在有m个操作,操作有以下两种: 1.1 d :询问是否有连续d个空的房间,若有则输出 ...

  8. (简单) POJ 3667 Hotel,线段树+区间合并。

    Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...

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

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

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

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

随机推荐

  1. preventDefault

    e.preventDefault()阻止事件默认行为 例如: $("a").click(function (e) {   alert("默认行为被禁止喽"); ...

  2. php图片添加文字水印方法汇总

    方法一: <?php header("content-type:text/html;charset=utf-8"); //指定图片路径 $src = "img/a. ...

  3. CentOS6.8设置开机直接进入命令行模式

    在linux图形界面中,按 “Alt+Ctrl+F1”,进入命令行界面. 切换到root用户 # vi /etc/inittab 找到下面的语句: # Default runlevel. The ru ...

  4. org.xml.sax.SAXParseException: prolog 中不允许有内容

    org.xml.sax.SAXParseException: prolog 中不允许有内容 digester.fatalError 不下心踢了电源导致的错误应该是解析xml出问题,找了半天不知道哪个x ...

  5. jquery把int类型转换成字符串类型的方法

    jQuery中把获取的number类型数据转换成字符串类型 var val=$(“#id).val(); If(typeof val==”number”){ val+=' '; }

  6. 使用Visual Studio将C#生成DLL文件的方法

    1.命令方式 打开Visual Studio安装目录下的开发人员命令提示 译 File.cs 以产生 File.exe csc File.cs 编译 File.cs 以产生 File.dll csc ...

  7. Spark Streaming源码分析 – Checkpoint

    PersistenceStreaming没有做特别的事情,DStream最终还是以其中的每个RDD作为job进行调度的,所以persistence就以RDD为单位按照原先Spark的方式去做就可以了, ...

  8. golang包管理

    https://studygolang.com/articles/8413 https://studygolang.com/articles/10523

  9. Mysql课后思考题

    1.请简述数据库.表和数据库服务器之间的关系? 知识点数据库存储结构 一个数据库服务器可以管理多个数据库,通常情况下开发人员会针对每个应用创建一个数据库,为保存应用中实体的数据,会在数据库中创建多个表 ...

  10. Effective C++ Item 12 Copy all parts of an object

    This one is simple, do not forget to copy all parts of an object in copy constructor or assignment o ...