题目链接:http://poj.org/problem?id=3667

题目大意:一共有n个房间,初始时都是空的,现在有m个操作,操作有以下两种:

1.1 d :询问是否有连续d个空的房间,若有则输出连续房间的起始编号,若无则输出0

2.2 xi d:将第xi个房间至第xi+d-1个房间清空

解题思路:线段树维护区间最大连续长度,tree[cur].lm代表以区间左端点为起点的连续段的长度 tree[cur].rm代表以区间右端点为终点的连续段的长度,tree[2*cur].rm+tree[2*cur+1].lm代表包含该区间中点的连续段的长度 这是个隐含值(中间连续段),则区间内最长连续段值不止要从左右子节点的最长连续段中择最大 还要考虑该区间的中间连续段即tree[cur].len=max(tree[2*cur].rm+tree[2*cur+1].lm,max(tree[2*cur].len,tree[2*cur+1].len));

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=;
int n,m;
struct node{
int lm,rm,len,cov;
}tree[maxn<<]; void pushup(int len,int rt){
tree[rt].lm=tree[rt<<].lm;
if(tree[rt].lm==len-(len>>)){
tree[rt].lm+=tree[rt<<|].lm;
}
tree[rt].rm=tree[rt<<|].rm;
if(tree[rt].rm==(len>>)){
tree[rt].rm+=tree[rt<<].rm;
}
tree[rt].len=max(tree[rt<<].rm+tree[rt<<|].lm,max(tree[rt<<].len,tree[rt<<|].len));
}
void pushdown(int len,int rt){
if(tree[rt].cov!=-){
tree[rt<<].cov=tree[rt<<|].cov=tree[rt].cov;
tree[rt<<].lm=tree[rt<<].rm=tree[rt<<].len=tree[rt].cov?:(len-(len>>));
tree[rt<<|].lm=tree[rt<<|].rm=tree[rt<<|].len=tree[rt].cov?:(len>>);
tree[rt].cov=-;
}
}
void build(int l,int r,int rt){
tree[rt].cov=-;
tree[rt].lm=tree[rt].rm=tree[rt].len=r-l+;
if(l==r) return;
int mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
}
void update(int L,int R,int val,int l,int r,int rt){
if(L<=l&&R>=r){
tree[rt].cov=val;
tree[rt].lm=tree[rt].rm=tree[rt].len=val?:(r-l+);
return;
}
int mid=(l+r)>>;
pushdown(r-l+,rt);
if(L<=mid) update(L,R,val,l,mid,rt<<);
if(R>mid) update(L,R,val,mid+,r,rt<<|);
pushup(r-l+,rt);
}
int query(int w,int l,int r,int rt){
if(l==r)return ;
pushdown(r-l+,rt);
int mid=(l+r)>>;
if(tree[rt<<].len>=w) return query(w,l,mid,rt<<);
else if(tree[rt<<].rm+tree[rt<<|].lm>=w) return mid-tree[rt<<].rm+;
else return query(w,mid+,r,rt<<|);
} int main(){
scanf("%d%d",&n,&m);
build(,n,);
while(m--){
int op,x,cnt,ans;
scanf("%d",&op);
if(op==){
scanf("%d",&cnt);
if(tree[].len<cnt) ans=;
else ans=query(cnt,,n,);
printf("%d\n",ans);
if(ans>)
update(ans,ans+cnt-,,,n,);
}else{
scanf("%d%d",&x,&cnt);
update(x,x+cnt-,,,n,);
}
}
return ;
}

POJ 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. poj 3667 Hotel (线段树)

    http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 94 ...

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

    Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...

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

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

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

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

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

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

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

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

  10. POJ 2482 Stars in Your Window (线段树区间合并+扫描线)

    这题开始一直被矩形框束缚了,想法一直都是枚举线,但是这样枚举都需要O(n^2)...但是看了别人的思路,感觉这题思想真心很好(PS:开头好浪漫的描述啊,可惜并没有什么用)  题意就是在平面上给你一些星 ...

随机推荐

  1. switch 失效

    switch  开关失效无法切换,可以关闭,无法开启. 发现问题点 require-table.js 中toggle value的数据类型不是 number 导致 (value ? no : yes ...

  2. shell脚本之浮点数和整数计算

    整数计算 直接使用放括号计算即可,省去*号需要使用转义符的麻烦 #!/bin/bash num1= num2= var1=$[ $num1 * $num2 ] echo "$var1&quo ...

  3. excel简单操作

    百度网盘(npoi.dll): http://pan.baidu.com/s/14eJRw //先创建一个文件流,指向磁盘上的某个Excel文件 using (FileStream fsRead = ...

  4. leetcode 134 加油站问题

    leetcode 134 解析 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 co ...

  5. python是强类型还是弱类型语言

    几句话了解python特性 Python 是强类型的动态脚本语言 好多人对python到底是强语言类型还是弱语言类型存在误解,其实,是否是强类型语言只需要一句话就可以判别, 强类型:不允许不同类型相加 ...

  6. 网易云课堂_C++程序设计入门(下)_第7单元:出入虽同趣,所向各有宜 – 文件输入和输出_第7单元 - 作业2:编程互评

    第7单元 - 作业2:编程互评 查看帮助 返回   提交作业(剩余10天) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩   由于在线编程不支持 ...

  7. Jackson常用注解及用法

    最近写项目,用到Jackson的一些注解,总结一下,帮助自己记忆. 1.@JsonIgnore 和 @JsonIgnoreProperties 两个注解可以对照比较后选择使用: @JsonIgnore ...

  8. ElasticSearch Machine Learning

    https://www.youtube.com/watch?v=DBRISS0UKcA, 2017/04 Single Metric job: 我想按照 一定的time interval 去 aggr ...

  9. offsetof与container_of宏分析

    offsetof宏:结构体成员相对结构体的偏移位置 container_of:根据结构体成员的地址来获取结构体的地址 offsetof 宏 原型: #define offsetof(TYPE, MEM ...

  10. C语言第十一周作业

        这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/ ...