题很简单:给两个操作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 区间合并,找最左边的空余块的更多相关文章

  1. poj3667(线段树区间合并&区间查询)

    题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...

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

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

  3. 洛谷 P2894 [USACO08FEB]酒店Hotel-线段树区间合并(判断找位置,不需要维护端点)+分治

    P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...

  4. 区间合并 POJ3667+HDU4553

    两道题都是线段树的区间合并 lsum, rsum分别表示左/右端点 开始向右/左 符合条件的元素的最长连续长度 sum表示这个区间的符合条件的元素的最长连续长度 所以pushUp可写: void pu ...

  5. poj3667 线段树 区间合并

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

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

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

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

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

  8. POJ 2750 Potted Flower(线段树的区间合并)

    点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的 ...

  9. hdu 3308(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Prometheus Node_exporter

    Node Exporter node_exporter 主要用于 *NIX 系统监控, 用 Golang 编写. 功能对照表 默认开启的功能 名称 说明 系统 arp 从 /proc/net/arp ...

  2. Python中if-else的多种写法

    a, b= 1, 2 将a和b两个变量中的最大值赋值给c (1)常规写法 if a>b:     c = a else:     c = b   (2)表达式 c = a if a>b e ...

  3. ruby计算完成率

    task_complete = ((task_forms_w.to_f / task_forms_num.to_f)*100).round(2).to_s << "%" ...

  4. 序列化时提示There was an error reflecting type 'System.Collections.Generic.List`1

    序列化xml文件到List中,非win10下出现了这个错误,但是在win10下正常.经过仔细的研究,发现是序列化工具类不能使用Static.去掉Static即可.

  5. 用Emacs的这些年

    读技术博客时发现又有人提起我曾写的那篇口水文章 为何Emacs和Vim被称为两大神器.写那篇文章时,我还在Vim和Emacs之间摇摆.当然主要在用vim,博士学位论文和所有的国际会议文章都是用Vim编 ...

  6. 进度条QProgressBar

    import sys from PyQt5.QtCore import Qt, QTimer from PyQt5.QtWidgets import QApplication, QWidget, QP ...

  7. SpringMVC上传文件的三种方式(待整理...)

    参考链接 http://www.cnblogs.com/fjsnail/p/3491033.html

  8. 运维数据库平台~inception审核规则详解

    ---恢复内容开始--- 一 简介:这次我们来介绍最核心的审核功能 二 讲解:简单来说 inception就是mysql的二次过滤,何谓二次过滤,我们知道,mysql本身都有自己的审核规则,为业界所通 ...

  9. Ubuntu/Debian 微信安装

    1. 更新系统 $ sudo apt-get update $ sudo apt-get install git-core curl build-essential openssl libssl-de ...

  10. ubuntu14.04 提示 卷 文件系统根目录 仅剩余xxx的硬盘空间