poj3667 区间合并,找最左边的空余块
题很简单:给两个操作1:查找最左边的a个空余块并填满
2:把从第a个开始的连续b个块置空
线段树维护左连续,右连续,最大连续,lazy-tag即可,query函数值得学习
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 500005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int lmx[maxn<<],rmx[maxn<<],mx[maxn<<],flag[maxn<<]; inline void set0(int l,int r,int rt){
lmx[rt]=rmx[rt]=mx[rt]=r-l+;
flag[rt]=;
}
inline void set1(int l,int r,int rt){
lmx[rt]=rmx[rt]=mx[rt]=;
flag[rt]=;
}
inline void pushup(int l,int r,int rt){
lmx[rt]=lmx[rt<<];rmx[rt]=rmx[rt<<|];
mx[rt]=max(mx[rt<<],mx[rt<<|]);
int m=l+r>>;
if(lmx[rt<<]==m-l+) lmx[rt]+=lmx[rt<<|];
if(rmx[rt<<|]==r-m) rmx[rt]+=rmx[rt<<];
if(rmx[rt<<]&&lmx[rt<<|])
mx[rt]=max(mx[rt],rmx[rt<<]+lmx[rt<<|]); }
inline void pushdown(int l,int r,int rt){
if(flag[rt]>=){
int m=l+r>>;
flag[rt<<]=flag[rt<<|]=flag[rt];
if(flag[rt]==){
set0(lson);set0(rson);
}
else if(flag[rt]==){
set1(lson);set1(rson);
}
flag[rt]=-;
}
}
void build(int l,int r,int rt){
if(l==r){
lmx[rt]=rmx[rt]=mx[rt]=;
flag[rt]=-;
return;
}
int m=l+r>>;
build(lson);
build(rson);
pushup(l,r,rt);
}
void update(int L,int R,int op,int l,int r,int rt){
if(L<=l && R>=r){
if(op==) set0(l,r,rt);
if(op==) set1(l,r,rt);
return;
}
pushdown(l,r,rt);
int m=l+r>>;
if(L<=m)
update(L,R,op,lson);
if(R>m)
update(L,R,op,rson);
pushup(l,r,rt);
}
//cnt要么在左儿子,要么在中间合并块,要么在右子树
int query(int cnt,int l,int r,int rt){
if(l==r)
return l;
pushdown(l,r,rt);
int m=l+r>>;
if(cnt<=mx[rt<<])
return query(cnt,lson);
else if(cnt<=rmx[rt<<]+lmx[rt<<|])
return m-rmx[rt<<]+;
else
return query(cnt,rson);
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)==){
build(,n,); int a,b,op;
while(m--){
scanf("%d",&op);
if(op==){
scanf("%d",&a);
if(mx[]<a){
puts("");
continue;
}
int tmp=query(a,,n,);
printf("%d\n",tmp);
update(tmp,tmp+a-,,,n,);
}
else if(op==){
scanf("%d%d",&a,&b);
update(a,a+b-,,,n,);
}
}
}
return ;
}
poj3667 区间合并,找最左边的空余块的更多相关文章
- poj3667(线段树区间合并&区间查询)
题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...
- poj3667 Hotel (线段树 区间合并)
poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...
- 洛谷 P2894 [USACO08FEB]酒店Hotel-线段树区间合并(判断找位置,不需要维护端点)+分治
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...
- 区间合并 POJ3667+HDU4553
两道题都是线段树的区间合并 lsum, rsum分别表示左/右端点 开始向右/左 符合条件的元素的最长连续长度 sum表示这个区间的符合条件的元素的最长连续长度 所以pushUp可写: void pu ...
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- POJ 2750 Potted Flower(线段树的区间合并)
点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的 ...
- hdu 3308(线段树区间合并)
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- Mysql错误 ERROR 1064 (42000): You have an error in your SQL syntax
语法错误,可能有各种各样的问题. 我这个摔的太疼了. 字段名不能用空格..
- 2018acm-icpc江苏邀请赛后记
这场比赛可真难. 不得不说矿大的环境大大出乎了我的意料,无论是校园面积还是基础设施都很好,唯一美中不足的大概是吃了一顿晚饭每个菜都有辣,幸好饭票发的很多,一个人四张饭票,一张饭票可以换3根香蕉,于是我 ...
- SSD详解
This results in a significant improvement in speed for high-accuracy detection(59 FPS with mAP 74.3% ...
- GoLang基础数据类型-切片(slice)详解
GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...
- TCP的代码
视频已经发布,这里是所有的代码仅供参考. TCP服务器: MainWindow里面的代码: using System; using System.Collections.Generic; using ...
- ruby导出exl方式
class Demo print "hello world" require "spreadsheet" #设置表格的编码为utf-8 Spreadsheet. ...
- 数据库中DQL、DML、DDL、DCL的概念与区别
SQL(Structure Query Language)语言是数据库的核心语言. SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL. 1. 数据 ...
- 007、Docker 架构详解(2018-12-24 周一)
参考https://www.cnblogs.com/CloudMan6/p/6763789.html Docker核心组件包括: Docker 客户端 Docker Clien ...
- iOS safari 苹果手机如何阻止页面弹性“橡皮筋效果”?
苹果上这个上下弹的效果对于有固定导航的页面,体验很不好 知乎上搜到一个并不是完美方案:https://www.zhihu.com/question/22256539 完美方案是有个国外插件叫:prev ...
- 在使用kvc进行赋值的时候,有时候会遇到null值,这个时候我们使用kvc会报错
在使用kvc进行赋值的时候,有时候会遇到null值,这个时候我们使用kvc会报错,如何解决 控制器代码如下: // // ViewController.m // 02-模型中的赋值 // // Cre ...