题意:宾馆有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. HTML基础---表单

    表单 <form id="" name="" method="post/get" action="负责处理的服务端" ...

  2. md5加密、Des加密对称可逆加密、RSA非对称可逆加密、https单边验证、银行U盾双边认证

    1.md5不可逆的加密方式,加密成一个32位的字符串.算法是公开的,任何语言的加密结果都是一样的.总有可能是重复的.     用途:             (1)防止明文存储:可以用作密码加密    ...

  3. NodeJs学习记录(一)初步学习,杂乱备忘

    2016/12/26 星期一 1.在win7下安装了NodeJs 1)进入官网 https://nodejs.org/en/download/,下载对应的安装包,我目前下载的是node-v6.2.0- ...

  4. Angular——$http

    基本介绍 $http用于向服务端发起异步请求,同时还支持多种快捷方式如$http.get().$http.post().$http.jsonp.$hhtp也是属于内置服务的一种,这里特意提出来写一篇用 ...

  5. 好用的sublime插件以及快捷键

    管理插件:使用Ctrl+`(Esc键下方)快捷键或者通过View->Show Console菜单打开命令行 import urllib.request,os,hashlib; h = '2915 ...

  6. clipboard.min.js 复制表格内容

    <script type="text/javascript" src="js/clipboard.min.js"></script> & ...

  7. (转)全文检索技术学习(一)——Lucene的介绍

    http://blog.csdn.net/yerenyuan_pku/article/details/72582979 本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得 ...

  8. HDU_1864_最大报销额_01背包

    最大报销额 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  9. CAD多个点构造选择集(网页版)

    主要用到函数说明: IMxDrawSelectionSet::SelectByPolygon 在多个点组合的闭合区域里,构造选择集.详细说明如下: 参数 说明 [in] IMxDrawPoints* ...

  10. adb 命令收藏学习地址

    adb 命令相关的网页https://www.cnblogs.com/medsonk/p/8334847.htmlhttps://www.cnblogs.com/medsonk/p/6959658.h ...