题目链接: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. KO 数据库分类系统介绍

    KEGG Orthology数据库不仅对基因的功能进行了扩充和整理,还对功能进行了细致的分类: 针对基因的功能,共有3级分类,第一级有6个大类: 打开下面这个链接 http://www.genome. ...

  2. Mac OS Yosemite 文件批量重命名

    首先,我们选中一个文件夹   右键,或者回车,给一个文件夹改名   同时选中三个文件夹   右键,选中批量更改   弹出批量更改,进行更改   改好后点回车,就能看到效果了   继续操作,完成所有文件 ...

  3. 在你开发完brew应用之后 ,你又如果将brew应用由编译成可以部署到brew真机上的程序包呢

    参考自:http://blog.csdn.net/feimor/article/details/6239281 一.准备工作(安装工具) 先安装Visual C++ 6.0,再安装BREW SDK v ...

  4. [dubbo] dubbo No provider available for the service

    com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method queryTemplate in the service com.x.a ...

  5. 在windows上自动备份SVN版本库及定时删除

    下面的脚本是在windows SVN的备份策略,采用的是hotcopy的方法 方案一: 1.先创建一个fullBackup的脚本:fullBackup.bat echo off rem Subvers ...

  6. poj_1182 并查集

    题目大意 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...

  7. 腾讯云大数据套件Hermes-MR索引插件使用总结

    版权声明:本文由王亮原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/121 来源:腾云阁 https://www.qclou ...

  8. 关于sencha touch 用phonegap打包后,docked悬停的组件被手机软键盘遮挡的解决方法

    这个问题应该算是phonegap的一个bug,在mainifest.xml 里android:windowSoftInputMode设置成了adjustpan,理论上不会出现遮挡悬停组件这种情况, 不 ...

  9. Promise、async、await在Egret的简单应用

    Egret Engnie 5.1.10 Egret Wing 4.1.5 一.Promise.async.await相关知识 Promise介绍 阮一峰 async函数 阮一峰 具体和详细的说明用法可 ...

  10. C# DateTime.Now详细用法

    //2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...