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:开头好浪漫的描述啊,可惜并没有什么用) 题意就是在平面上给你一些星 ...
随机推荐
- linux下面用Mingw编译libx264
linux下面用Mingw编译libx264 首先要先安装好mingw 我用的是Ubuntu 编译ffmpeg的时候 ,官方上面有一个自动化脚本能够把mingw安装好 这里就不说了 新版本的libx2 ...
- leetcode-mid-sorting and searching-162. Find Peak Element
mycode 54.81% class Solution(object): def findPeakElement(self, nums): """ :type num ...
- Spring 缓存切面
缓存切面:[通知+目标方法调用] 缓存操作执行过程: 1)如果是同步调用[sync=true],则首先尝试从缓存中读取数据,读取到则直接返回: 否则执行目标方法,将结果缓存后返回. 2)如果不是同步调 ...
- Spring mvc注解说明
编号 注解 说明 位置 备注 1 @Controller 将类变成Spring Bean 类 现阶段 @Controller . @Service 以及 @Repository 和 @Componen ...
- 【Bean】标签常用属性
[Bean]标签常用属性 Id 说明:起名称,id属性值名称任意,不能包含特殊符号,根据id得到配置对象. Class 说明:创建对象所在类的全路径. Name 说明:功能和id是一样的,id属性值不 ...
- 转:【开源必备】常用git命令
原文:https://zhuanlan.zhihu.com/p/25868120 [开源必备]常用git命令 [已重置] 如今在技术领域,码农们习惯了开源,也离不开免费开源的代码,轻松获取代码,不 ...
- Discrete Mathematics and Its Applications | 1 CHAPTER The Foundations: Logic and Proofs | 1.4 Predicates and Quantifiers
The statements that describe valid input are known as preconditions and the conditions that the outp ...
- FacertGrid()的使用
查看数据的前五行 tips = sns.load_dataset("tips") tips.head() 引入数据,布置横向画布 g = sns.FacetGrid(tips, c ...
- Vue.js系列:生命周期钩子
开发人员提供了一个Web开发人员可以在Vue.js应用程序的整个生命周期中使用的各种方法的讨论. 生命周期钩子是在Vue对象生命周期的某个阶段执行的已定义方法.从初始化开始到它被破坏时,对象都会遵循不 ...
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题
问题描述: 这个实际上是最后一部的问题,将生成的共享库文件放入到了/usr/local/opencv-arm/lib下,并且设置了LD_LIBRARY_PATH中为/usr/local/opencv- ...