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:开头好浪漫的描述啊,可惜并没有什么用) 题意就是在平面上给你一些星 ...
随机推荐
- 查看磁盘IO负载 - 看哪些进程在读写磁盘
原文:http://www.cnblogs.com/cloudstorage/archive/2012/11/11/2764623.html 今天晚上发现服务器io有点高,顺带看看哪些进程在读写磁盘. ...
- rbac权限组件整合到实际项目的全过程详述
rbac简介 项目的GitHub地址 欢迎Download&Fork&Star:https://github.com/Wanghongw/CombineRbac 另外,本文只简单介绍一 ...
- qemu-kvm: unable to map backing store for guest RAM: Cannot allocate memory
当给 KVM 虚拟机设置 hugepage 时,需要在虚拟机的配置文件里加上下面一段: <memoryBacking> <hugepages/></memoryBacki ...
- leetcode-mid-sorting and searching -347. Top K Frequent Elements
mycode 71.43% class Solution(object): def topKFrequent(self, nums, k): """ :type nu ...
- rosbag 那些事
..bag文件转.txt 将file_name.bag文件中topic_name话题的消息转换到Txt_name.txt文件中: rostopic echo -b file_name.bag -p / ...
- spring 中的一些注解功能--不定更新
1@Qualifier注解? 下面的示例将会在Customer的person属性中自动装配Person的值. public class Customer { @Autowired private Pe ...
- iOS证书详解
一.成员介绍1. Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1) Developer Certification(开发证书)安装在电脑上 ...
- 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作
定义List<Account> accounts,生成getter和setter 复制AccountTest类改名UserTest类 修改测试类 还没封装所以Account的list都是n ...
- 用apicloud+vue的VueLazyload实现缓存图片懒加载
<script src="../../script/vue-lazyload.js"></script><img v-lazy="remot ...
- 【算法与数据结构】图的最小生成树 MST - Prim 算法
Prim 算法属于贪心算法. #include <stdio.h> #define VERTEXNUM 7 #define INF 10000 typedef struct Graph { ...