题意:宾馆有N个房间(1~N),M个操作,a=1,输入b,表示N间房是否有连续的b间房。有输出最左边的房编号

没有输出0。a=2,输入b,c表示房间b到c清空。

模仿了大神的代码,敲了一遍,有些地方还要深入了解。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <math.h>
#define M 50001
#define eps 1e-6
#define LL long long
using namespace std; struct node
{
int left,right;
int lsum,rsum,msum;
int lazy;
}tree[M*3]; void push_up(int id)
{
int ll=tree[id<<1].right-tree[id<<1].left+1;
int rr=tree[id<<1|1].right-tree[id<<1|1].left+1;
tree[id].lsum=tree[id<<1].lsum;
if(tree[id<<1].lsum==ll)
tree[id].lsum+=tree[id<<1|1].lsum;
tree[id].rsum=tree[id<<1|1].rsum;
if(tree[id].rsum==rr)
tree[id].rsum+=tree[id<<1].rsum;
tree[id].msum = max(max(tree[id<<1].msum,tree[id<<1|1].msum),tree[id<<1].rsum+tree[id<<1|1].lsum);
}
void push_down(int id)
{
if(tree[id].lazy!=-1)
{
int ll=tree[id<<1].right-tree[id<<1].left+1;
int rr=tree[id<<1|1].right-tree[id<<1|1].left+1;
tree[id<<1].lazy=tree[id<<1|1].lazy=tree[id].lazy;
tree[id].lazy=-1;
tree[id<<1].rsum = tree[id<<1].lsum = tree[id<<1].msum = tree[id<<1].lazy ? 0:ll;
tree[id<<1|1].rsum = tree[id<<1|1].lsum = tree[id<<1|1].msum = tree[id<<1|1].lazy ?0:rr;
}
}
void build(int id,int l,int r)
{
tree[id].left=l;tree[id].right=r;
tree[id].lsum=tree[id].rsum=tree[id].msum=(r-l+1);
tree[id].lazy=-1;
if(l==r)
return ;
int mid=(l+r)/2;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
//push_up(id);
} void update(int id,int l,int r,int c)
{
if(tree[id].left==l&&tree[id].right==r)
{
tree[id].lsum=tree[id].rsum=tree[id].msum=c?0:(r-l+1);
tree[id].lazy=c;
return ;
}
push_down(id);
int mid=(tree[id].left+tree[id].right)/2;
if(r<=mid) update(id<<1,l,r,c);
else if(l>mid) update(id<<1|1,l,r,c);
else
{
update(id<<1,l,mid,c);
update(id<<1|1,mid+1,r,c);
}
push_up(id);
}
int query(int id,int v)
{
if(tree[id].left==tree[id].right) return tree[id].left;
push_down(id);
int mid=(tree[id].left+tree[id].right)/2;
if(tree[id<<1].msum>=v)//假设左子树的最大连续空>=需求量。那么直接进入左子树,=也去左子树的原因是题目要求的最左
return query(id<<1,v);
else if(tree[id<<1].rsum+tree[id<<1|1].lsum>=v)//左子树的连续右+右子树的连续左>=w,说明找到了能够直接求出
return mid-tree[id<<1].rsum+1;
return query(id<<1|1,v);
} int main()
{ int n,m;
while(~scanf("%d%d",&n,&m))
{
int a,b,c;
build(1,1,n);
while(m--)
{
scanf("%d",&a);
if(a==1)
{
scanf("%d",&c);
if(tree[1].msum<c) printf("0\n");//根节点的最大连续空间不够
else
{
int p=query(1,c);
printf("%d\n",p);
update(1,p,p+c-1,1);//把这段更新为被覆盖
}
}
else
{
scanf("%d%d",&b,&c);
update(1,b,b+c-1,0);//把这段更新为未被覆盖
}
}
}
return 0;
} /*
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
*/

PKU 3667 Hotel (线段树,区间合并,最长连续区间)的更多相关文章

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

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

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

    题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...

  3. POJ 3667 & 1823 Hotel (线段树区间合并)

    两个题目都是用同一个模板,询问最长的连续未覆盖的区间 . lazy代表是否有人,msum代表区间内最大的连续长度,lsum是从左结点往右的连续长度,rsum是从右结点往左的连续长度. 区间合并很恶心啊 ...

  4. PKU 3667 Hotel(线段树)

    Hotel The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...

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

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

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

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

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

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

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

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

  9. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  10. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

随机推荐

  1. php angular/think angular/php模版引擎

    在thinphp5中发现一个好用的模版引擎—think-angular, 此模板引擎主要特点是 不需要额外的标签定义, 全部使用属性定义, 写好的模板文件在IDE格式化代码的时候很整洁, 因为套完的模 ...

  2. Farseer.net轻量级开源框架 中级篇:自定义配置文件

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 下一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 ...

  3. jstree的基本使用例子

    var menu = (function() { var _menu = {data:{}, initMenu : function() { $.jstree.defaults.core.themes ...

  4. Queries for Number of Palindromes(求任意子列的回文数)

    H. Queries for Number of Palindromes time limit per test 5 seconds memory limit per test 256 megabyt ...

  5. DWARF调试格式的简介

    DWARF调试格式的简介 Michael J. Eager, Eager Consulting Feb, 2007 翻译:吴晖 2012年2月 如果我们可以编写确保能正确工作且永远不需要调试的程序,这 ...

  6. Windows下编译64位GSL

    GSL (GNU Scientific Library, http://www.gnu.org/software/gsl/)官方并没有提供编译好的Windows版本.首先要保证Windows是64位的 ...

  7. CSS:div/img水平垂直居中

    div水平垂直居中方法一: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  8. Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean

    WebsocketSourceConfiguration { @Bean ServletWebServerFactory servletWebServerFactory(){ return new T ...

  9. Java基础(九)--反射

    什么是反射? 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性 这种动态获取的信息以及动态调用对象的方法的功能称为反射机制. 反射的前 ...

  10. Robot Framework(九) 执行测试用例——基本用法

    3.1基本用法 Robot Framework测试用例从命令行执行,默认情况下,最终结果是XML格式的输出文件和HTML 报告和日志.执行后,可以组合输出文件,然后使用rebot工具进行后处理. 3. ...