【题意】

一段区间初始均为可行。有两个操作:

1→找出长度为w的一段可行区间,如果存在则返回这个可行区间最靠左的情况,并将该区间设为不可行;

2→将区间[a,b]设为可行区间。

【思路】

经典的线段树合并,代码依旧用的是神犇的线段树模板。详见注释。

【错误点】

延迟标记的时候,忘记把cover清为-1了,导致RE!

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int MAXN=+;
int cover[MAXN<<];//-1表示当前没有覆盖标记,1表示均覆盖为不可行,0表示均覆盖为可行
int lsum[MAXN<<];//该区间从左起连续的可用区间长度的最大值
int msum[MAXN<<];//该区间中连续的可用区间长度的最大值
int rsum[MAXN<<];//该区间从右起连续的可用区间长度的最大值 void PushUp(int rt,int m)
{
lsum[rt]=lsum[rt<<];
if (lsum[rt]==m-(m>>)) lsum[rt]+=lsum[rt<<|];
/*如果左孩子全部为可用区间,那么加上右孩子的左端*/
rsum[rt]=rsum[rt<<|];
if (rsum[rt]==m>>) rsum[rt]+=rsum[rt<<];
/*同上*/
msum[rt]=max(max(msum[rt<<],msum[rt<<|]) , rsum[rt<<]+lsum[rt<<|]);
/*该区间的可用区间可能是:左孩子最大的可用区间、有孩子最大的可用区间,和跨越左右孩子加在一起的可用区间*/
} void PushDown(int rt,int m)
{
if (cover[rt]!=-)
{
cover[rt<<]=cover[rt<<|]=cover[rt];
if (cover[rt]==)
{
msum[rt<<]=lsum[rt<<]=rsum[rt<<]=;
msum[rt<<|]=lsum[rt<<|]=rsum[rt<<|]=;
}
else
{
msum[rt<<]=lsum[rt<<]=rsum[rt<<]=m-(m>>);
msum[rt<<|]=lsum[rt<<|]=rsum[rt<<|]=m>>;
}
cover[rt]=-;
/*千万不要忘记将rt清为-1*/
}
} int query(int w,int l,int r,int rt)
{
if (l==r) return l;
PushDown(rt,r-l+);
int m=(l+r)>>;
if (msum[rt<<]>=w) return(query(w,lson));
/*由于要找最左边的区间,按照左孩子、跨越两者、有孩子的顺序查找*/
if (rsum[rt<<]+lsum[rt<<|]>=w) return(m-rsum[rt<<]+);
return(query(w,rson));
} void update(int L,int R,int o,int l,int r,int rt)
{
if (L<=l && r<=R)
{
cover[rt]=o;
if (o==) msum[rt]=lsum[rt]=rsum[rt]=;
else msum[rt]=lsum[rt]=rsum[rt]=r-l+;
return;
}
PushDown(rt,r-l+);//这里是l和r,不要写成L和R
int m=(l+r)>>;
if (L<=m) update(L,R,o,lson);
if (m<R) update(L,R,o,rson);
PushUp(rt,r-l+);
} void build(int l,int r,int rt)
{
msum[rt]=lsum[rt]=rsum[rt]=r-l+;
cover[rt]=-;
if (l==r) return;
int m=(l+r)>>;
build(lson);
build(rson);
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
build(,n,);
for (int i=;i<m;i++)
{
int op;
scanf("%d",&op);
if (op==)
{
int w;
scanf("%d",&w);
if (msum[]<w) cout<<<<endl;
/*如果根的可用区间已经小于w,那么一定是找不到长度为w的可用区间*/
else
{
int p=query(w,,n,);
cout<<p<<endl;
update(p,p+w-,,,n,);
}
}
else
{
int u,v;
scanf("%d%d",&u,&v);
update(u,u+v-,,,n,);
}
}
return ;
}

【线段树区间合并】POJ3667-Hotel的更多相关文章

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

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

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

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

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

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

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

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

  5. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  6. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

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

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

  8. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  9. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  10. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

随机推荐

  1. bzoj 2733 平衡树启发式合并

    首先对于一个连通块中,询问我们可以直接用平衡树来求出排名,那么我们可以用并查集来维护各个块中的连通情况,对于合并两个平衡树,我们可以暴力的将size小的平衡树中的所有节点删掉,然后加入大的平衡树中,因 ...

  2. jsp之jstl核心标签库

    JSTL核心标签库技术 1. JSTL介绍 在JSP页面中即可书写html,也可以书写Java代码,导致页面混乱,维护,修改,升级难度加大,于是国际上不同的公司在实际应用中,根据页面的需求将Java代 ...

  3. eCharts 多个图表自适应窗口大小

    单个图表自适应页面窗口只需要在创建图表节点后面添加一句代码就可以了: window.onresize = myChart.resize; 多图表要自适应页面,创建图表节点后面添加事件,并在事件函数里面 ...

  4. this指针再解

     this.new.call和apply的相关问题 讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一 ...

  5. bASE--Risk

    //参考base-4.0.2.jar public class Risk implements Serializable //规则名public String ruleName; //规则包名publ ...

  6. SQL Workbench/J

    最近测试segment, 使用了一个新的DB--SQL Workbench/J, 参考文档:http://docs.aws.amazon.com/redshift/latest/mgmt/connec ...

  7. [Leetcode Week17]Copy List with Random Pointer

    Copy List with Random Pointer 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/copy-list-with-random- ...

  8. python实战===一键刷屏

    #当按键q的时候,自动输入 “大家好!”并回车键发送!from pynput import keyboard from pynput.keyboard import Key, Controller k ...

  9. HTML+CSS+JS(+Vue)写一个通讯录组件

    求各位大大的Star(*/ω\*). 没有录屏,所以上传的是图片.后面已补充录屏效果. 效果:(主要是参考小米Note3的通讯录的效果做的) 主要功能: 1. 滚动后,通讯录的模块标题会固定在顶部(图 ...

  10. Docker学习总结之跨主机进行link

    原文来自: http://www.cnblogs.com/vikings-blog/p/4223462.html