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 ...
随机推荐
- 三种数据库连接池的配置及使用(For JDBC)
DBCP 一.导包 Apache官网下载DBCP包,导入两个包路径如下: commons-dbcp-1.4-bin\commons-dbcp-1.4\commons-dbcp-1.4.jar:连接池的 ...
- Log4net(三)——RollingFileAppender配置
RollingFileAppender配置 log4net的记录介质很多,这里只总结最常用的方式之一:RollingFileAppender. 1.日志文件名是以文件大小进行变换的 如果日志文件大小到 ...
- Docker 入门 第三部分: 服务
目录 Docker 入门 第三部分: 服务 先决条件 介绍 你的第一个 docker-compose.yml 文件 docker-compose.yml 运行你新建的负载均衡应用 扩展应用程序 卸载应 ...
- Centos下新建用户及修改用户目录
Centos下新建用户及修改用户目录 Hillgo 关注 2015.09.22 01:32* 字数 154 阅读 3492评论 0喜欢 3 添加及删除用户 添加用户 test: adduser tes ...
- Kafka0.10.0安装配置
1 解压文件 tar -zvxf kafka_2.11-0.10.0.0.tgz 2 修改配置server.properties vim server.properties broker.id=1 z ...
- mysql 案例 ~ 分析执行完的大事务
一 简介:今天咱们来聊聊如何定位以及执行完的大事务 二 目的:通过分析binlog脚本来定位执行的大事务 三 分析脚本 mysqlbinlog --base64-output=decode-rows ...
- 创建Git独立分支
在使用git进行版本控制的某些场景中我们可能需要在一个项目中建立完全独立的分支,此分支将作为一个独立的版本历史根节点,不与之前任何分支拥有相同的版本祖先. 比如当我们要在一个项目中使用一个分支进行项目 ...
- bootstrap-table前端修改数据
使用bootstrap-table显示数据,后台传回数据以后,可能需要对其做调整,如需要前端为数据添加单位 调整数据代码 $("#"+tableId).bootstrapTable ...
- Django CSRF提交遇见的问题
简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有 ...
- 【Udacity并行计算课程笔记】- Lesson 2 The GPU Hardware and Parallel Communication Patterns
本小节笔记大纲: 1.Communication patterns gather,scatter,stencil,transpose 2.GPU hardware & Programming ...