【线段树区间合并】POJ3667-Hotel
【题意】
一段区间初始均为可行。有两个操作:
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的更多相关文章
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- 线段树(区间合并) 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 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- HYSBZ 1858 线段树 区间合并
//Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...
随机推荐
- 移动端页面使用rem布局
阿里团队的高清布局方案代码 所谓高清方案就是根据设备屏幕的DPR(设备像素比,又称DPPX,比如dpr=2时,表示1个CSS像素由4个物理像素点组成) 动态设置 html 的font-size, 同时 ...
- Tomcat的安装以及基本配置
Tomcat是目前最常见也是最流行的基于java的一个web服务器软件 Tomcat的安装 (1)首先需要java环境,也就是说要依赖于java虚拟机JVM (2)下载Tomcat ,地址 ...
- vue_axios请求后台接口cookie无法传值
2018年3月7日: 当我们使用http向后台发送请求的时候,需要通过cookie把一些密匙传递给后台做判断授权登陆,当然前提是后台会先把cookie保持到本地. 使用vue开发的时候,会出现这个问题 ...
- hdu 2717 Catch That Cow(广搜bfs)
题目链接:http://i.cnblogs.com/EditPosts.aspx?opt=1 Catch That Cow Time Limit: 5000/2000 MS (Java/Others) ...
- poj 1837 Balance(背包)
题目链接:http://poj.org/problem?id=1837 Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- arpspoof dnsspoof中间人攻击
最近搞了一个监听神器,尽管使用了网卡混杂模式,不过监听到的几乎全是本地流量, 为了获取更多有用的数据,搞一下中间人攻击,最基本的就是arpspoof + IP转发,这样就可以获得局域网内任何人的上网流 ...
- 从零开始PHP攻略(001)——Bob的汽车零部件商店
1.创建订单表单 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- linux中字符串转换函数 simple_strtoul【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/7480087 Linux内核中提供的一些字符串转换函数: lib/vsprintf.c [htm ...
- 2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354 题意:求删去每个点后图是否存在奇环(n,m<=1e5) 解法:很经典的套路,和这题一样:h ...
- ubuntu命令行操作mysql常用操作
登陆mysql harvey@harvey-Virtual-Machine:~/ruby/mydiary$ mysql -u root -p Enter password: Welcome to th ...