POJ 3667 Hotel (线段树区间合并)
题目链接: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 (线段树区间合并)的更多相关文章
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- POJ 3667 Hotel (线段树区间合并)
题目链接:http://poj.org/problem?id=3667 最初给你n间空房,m个操作: 操作1 a 表示检查是否有连续的a间空房,输出最左边的空房编号,并入住a间房间. 操作2 a b ...
- POJ 3667 & 1823 Hotel (线段树区间合并)
两个题目都是用同一个模板,询问最长的连续未覆盖的区间 . lazy代表是否有人,msum代表区间内最大的连续长度,lsum是从左结点往右的连续长度,rsum是从右结点往左的连续长度. 区间合并很恶心啊 ...
- poj 3667 Hotel (线段树)
http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 94 ...
- poj 3667 Hotel(线段树,区间合并)
Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- Poj 3667——hotel——————【线段树区间合并】
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13124 Accepted: 5664 Descriptio ...
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- POJ 2482 Stars in Your Window (线段树区间合并+扫描线)
这题开始一直被矩形框束缚了,想法一直都是枚举线,但是这样枚举都需要O(n^2)...但是看了别人的思路,感觉这题思想真心很好(PS:开头好浪漫的描述啊,可惜并没有什么用) 题意就是在平面上给你一些星 ...
随机推荐
- keystonejs富文本问题及思考过程
上一篇讲了keystonejs的环境搭建,helloworld跑起来之后,实际运用中会发现各种问题,今天就说下富文本编辑器的问题(针对后端不熟的同学). 不太熟悉网页嵌入富文本编辑器的同学可能和我一样 ...
- 20175201张驰 实验四 Android 开发
4-1:[Android Studio安装]安装过程中出现的错误:参考https://blog.csdn.net/weixin_38277423/article/details/80254483 1. ...
- Java 有几种修饰符?分别用来修饰什么
4种修饰符 访问权限 类 包 子类 其他包 public ∨ ∨ ∨ ∨ protect ∨ ∨ ∨ × default ∨ ∨ ...
- 洛谷P1190 接水问题
题目名称:接水问题 题目来源 [洛谷P1190] (https://www.luogu.org/problemnew/show/P1190) 题目描述 学校里有一个水房,水房里一共有\(m\)个龙头 ...
- SpringBoot -- 配置mysql、hibernate
# application.properties# Server settings (ServerProperties)server.port=8081server.address=127.0.0.1 ...
- C# 创建和引入动态链接库dll文件
一.创建动态链接库dll文件 新建 -> 项目->类库 名称为:dlltest 添加函数:消息框弹出消息 using System.Collections.Generic; using S ...
- C#中winform下利用ArcEngine调用ArcGIS Server发布的服务 AE 10
开发环境:vs2010 + AE 10 测试 public Form1() { ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engi ...
- windows下 文件资源管理器 的操作
alt + d 可以直接把光标移动到地址栏 shift + f10 可以触发右键, 后面就可以用键盘操作右键中的内容了 ( 如打开vscode alt + 空格 可以弹出窗口的菜单栏 ( 控制最大化 ...
- 二:flask-debug模式详解
debug模式的情况下可以抛出详细异常信息 新建一个脚本并运行 访问 此时是非debug模式,如果运行的时候代码报错了,是不会提示详细错误的,只会报服务器内部错误 开启debug模式,可以查看到详细错 ...
- Ehlib好用的版本
EhLib 6.2