此题不难却易出错,很能考察思维的严谨性。

指定ll为区间内左端顶格数的连续可利用房间,rr为右端顶格数的数值,mm为区间内最长的连续可利用房间数。

在查询的时候,由于要返回最靠左的区间左端点,使得在该点右侧有长为l的可利用房间数。

那么首先有解存在当且仅当区间mm值大于等于给定长度l。

考虑区间左端点可能落在左区间也可能落在右区间。

横跨区间中点的情形特别要小心,我就是在这wa了几次。

http://poj.org/problem?id=3667

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define lson (u << 1)
#define rson (u << 1 | 1)
using namespace std;
typedef __int64 LL;
const int maxn = 5e4 + ;
struct Seg{
int l, r;
int lazy;
int ll, mm, rr;//vacant rooms
}seg[maxn << ];
int n, m, ans; void build(int u, int l, int r){
seg[u].l = l, seg[u].r = r, seg[u].lazy = ;
seg[u].mm = seg[u].ll = seg[u].rr = r - l;
if(r - l < ) return;
int mid = (l + r) >> ;
build(lson, l, mid);
build(rson, mid, r);
} void push_down(int u){
if(seg[u].lazy != && seg[u].r - seg[u].l > ){
if(seg[u].lazy == -){
seg[lson].lazy = seg[rson].lazy = -;
seg[lson].mm = seg[lson].rr = seg[lson].ll = seg[lson].r - seg[lson].l;
seg[rson].mm = seg[rson].rr = seg[rson].ll = seg[rson].r - seg[rson].l;
seg[u].lazy = ;
}else if(seg[u].lazy == ){
seg[lson].lazy = seg[rson].lazy = ;
seg[lson].mm = seg[lson].rr = seg[lson].ll = ;
seg[rson].mm = seg[rson].rr = seg[rson].ll = ;
seg[u].lazy = ;
}
}
} void push_up(int u){
seg[u].mm = max(seg[lson].rr + seg[rson].ll, seg[lson].mm);
seg[u].mm = max(seg[u].mm, seg[rson].mm);
seg[u].ll = seg[lson].ll == seg[lson].r - seg[lson].l ? seg[lson].ll + seg[rson].ll : seg[lson].ll;
seg[u].rr = seg[rson].rr == seg[rson].r - seg[rson].l ? seg[rson].rr + seg[lson].rr : seg[rson].rr;
} void query(int u, int l, int r, int p){
if(seg[u].mm < p || ans != -) return;
if(seg[u].ll >= p){
ans = seg[u].l;
return;
}
push_down(u);
int mid = (l + r) >> ;
if(seg[lson].mm >= p) query(lson, l, mid, p);
else if(seg[lson].rr + seg[rson].ll >= p) ans = mid - seg[lson].rr;
else query(rson, mid, r, p);
} void update(int u, int l, int r, int L, int R, int sg){
if(l == L && R == r){
if(sg == -){
seg[u].mm = seg[u].rr = seg[u].ll = r - l;
seg[u].lazy = -;
}else if(sg == ){
seg[u].mm = seg[u].rr = seg[u].ll = ;
seg[u].lazy = ;
}
return;
}
push_down(u);
int mid = (l + r) >> ;
if(R <= mid) update(lson, l, mid, L, R, sg);
else if(L >= mid) update(rson, mid, r, L, R, sg);
else{
update(lson, l, mid, L, mid, sg);
update(rson, mid, r, mid, R, sg);
}
push_up(u);
} int main(){
freopen("in.txt", "r", stdin);
while(~scanf("%d%d", &n, &m)){
build(, , n + );
for(int i = , u, v, op; i < m; i++){
scanf("%d", &op);
if(op == ){
scanf("%d", &u);
ans = -;
query(, , n + , u);
printf("%d\n",ans == - ? : ans);
if(ans != -) update(, , n + , ans, ans + u, );
}else if(op == ){
scanf("%d%d", &u, &v);
update(, , n + , u, u + v, -);
}
}
}
return ;
}

poj3667 Hotel的更多相关文章

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

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

  2. [POJ3667]Hotel(线段树,区间合并)

    题目链接:http://poj.org/problem?id=3667 题意:有一个hotel有n间房子,现在有2种操作: 1 a,check in,表示入住.需要a间连续的房子.返回尽量靠左的房间编 ...

  3. POJ3667 Hotel 题解

    和最大子段和的思路是一样的,可以记 \(lmax,rmax,dat\) 分别表示从当前区间最靠左/右的最大连续空子段和当前区间的最大连续空子段. 需要用延迟标记,每次遇到开房操作先ask,如果能找到就 ...

  4. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  5. HDU 3308 LCIS 线段树区间更新

    最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛  ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...

  6. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  7. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  8. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  9. 【转】 线段树完全版 ~by NotOnlySuccess

    载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...

随机推荐

  1. Java基础之一组有用的类——使用正则表达式搜索子字符串(TryRegex)

    控制台程序. 正则表达式只是一个字符串,描述了在其他字符串中搜索匹配的模式.但这不是被动地进行字符序列匹配,正则表达式其实是一个微型程序,用于一种特殊的计算机——状态机.状态机并不是真正的机器,而是软 ...

  2. 来自“Java中国”优秀的程序员不会觉得累成狗是一种荣耀

    分享下“https://java-china.org/topic/28“,也算是对自己的一种告诫吧. 原文:Sleep deprivation is not a badge of honor 先介绍一 ...

  3. 从gitlab下载好cocoapods中遇到的问题

    如果遇到 [!] Unable to satisfy the following requirements: - `Mantle (~> 2.0.3)` required by `Podfile ...

  4. IOS Suppot Font 苹果默认支持的字体一览(配图)

    这些字体都是IOS设备(使用ipad2测试) 默认支持的字体,也就是在AIR中不用设置绑定字体情况下 看到的样子 感觉上应该IOS仅为中文设置了一种字体就是 Heiti SC

  5. mysql之消息队列

    消息队列:在消息的传输过程中保存消息的容器. 消息队列管理器在将消息从它的源中继到它的目标时充当中间人.队列的主要目的是提供路由并保证消息的传递:如果发送消息时接收者不可用,消息队列会保留消息,直到可 ...

  6. jQuery习题的一些总结

    1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has $("div:has(s ...

  7. springday03-go2

    新建springmvc01项目1.创建项目,导入jar包 拷贝jar/spring/first下的五个spring的jar包,以及jar/spring/mvc下的两个mvcjar包放在lib下 2.创 ...

  8. mysql 导出过长的数字列时变科学计数法问题解决办法

    --mysql 导出数据时,  数字类型的列如果位数过长,变为科学技术发问题  concat('\t',a.IDCARD_NO)     例子: select   concat('\t',a.IDCA ...

  9. sql存储过程传入ID集合,和临时表的使用

    方式1: Declare @SQL NVarChar(max) set @SQL='select *from Loanee as a  ApplicationID in ('+@Application ...

  10. logstash5.x改变

    5.x版本 logstash中 elasticsearch插件的workers,无法配置大于1,会提示 This plugin uses the shared and doesn't need thi ...