题目链接:传送门

参考文章:传送门

思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = ;
int lsum[maxn<<],rsum[maxn<<],msum[maxn<<],cover[maxn<<];
void build(int x,int l,int r)
{
lsum[x]=rsum[x]=msum[x]=r-l+;
if(l==r) return ;
int mid=(l+r)>>;
build(x<<,l,mid);
build(x<<|,mid+,r);
}
int MAX(int x,int y)
{
return x>y?x:y;
}
void pushup(int x,int k)
{
lsum[x]=lsum[x<<];
rsum[x]=rsum[x<<|];
msum[x]=MAX(MAX(msum[x<<],msum[x<<|]),lsum[x<<|]+rsum[x<<]);
if(lsum[x<<]==(k-(k>>))) lsum[x]+=lsum[x<<|];
if(rsum[x<<|]==k>>) rsum[x]+=rsum[x<<];
}
void pushdown(int x,int k)
{
if(cover[x]!=-)
{
cover[x<<]=cover[x<<|]=cover[x];
lsum[x<<]=rsum[x<<]=msum[x<<]=cover[x]?:(k-(k>>));
lsum[x<<|]=rsum[x<<|]=msum[x<<|]=cover[x]?:(k>>);
cover[x]=-;
}
}
void update(int x,int l,int r,int A,int B,int Item)
{
if(A<=l&&r<=B)
{
cover[x]=Item;
lsum[x]=rsum[x]=msum[x]=Item?:r-l+;
return ;
}
pushdown(x,r-l+);
int mid=(l+r)>>;
if(A<=mid) update(x<<,l,mid,A,B,Item);
if(B>mid) update(x<<|,mid+,r,A,B,Item);
pushup(x,r-l+);
}
int query(int x,int l,int r,int len)
{
if(l==r) return ;
pushdown(x,r-l+);
int mid=(l+r)>>;
if(msum[x<<]>=len) return query(x<<,l,mid,len);
else if(rsum[x<<]+lsum[x<<|]>=len) return mid-rsum[x<<]+;
else return query(x<<|,mid+,r,len);
}
int main(void)
{
int n,m,i,x,y,z;
while(~scanf("%d%d",&n,&m))
{
build(,,n);
while(m--)
{
scanf("%d",&x);
if(x==)
{
scanf("%d",&y);
if(msum[]<y)
{
printf("0\n");
continue;
}
z=query(,,n,y);
printf("%d\n",z);
update(,,n,z,z+y-,);
}
else
{
scanf("%d%d",&y,&z);
update(,,n,y,y+z-,);
}
}
}
return ;
}

http://poj.org/problem?id=3667

poj-3667(线段树区间合并)的更多相关文章

  1. POJ 3667 线段树区间合并

    http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html 用线段树,首先要定义好线段树的节点信息,一般看到一个问题,很难很 ...

  2. POJ 3667 线段树区间合并裸题

    题意:给一个n和m,表示n个房间,m次操作,操作类型有2种,一种把求连续未租出的房间数有d个的最小的最左边的房间号,另一个操作时把从x到x+d-1的房间号收回. 建立线段树,值为1表示未租出,0为租出 ...

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

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

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

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

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

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

  6. POJ 2482 Stars in Your Window (线段树区间合并+扫描线)

    这题开始一直被矩形框束缚了,想法一直都是枚举线,但是这样枚举都需要O(n^2)...但是看了别人的思路,感觉这题思想真心很好(PS:开头好浪漫的描述啊,可惜并没有什么用)  题意就是在平面上给你一些星 ...

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

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

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

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

  9. HYSBZ 1858 线段树 区间合并

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

随机推荐

  1. @RequestBody使用须知

    -----------------------siwuxie095                                 @RequestBody 使用须知         使用 @Requ ...

  2. MySQL基本SQL语句之数据插入、删除数据和更新数据

    一.INSERT插入数据: 方法一:批量插入 基本语法: INSERT INTO tb_name (col1, col2, ...) VALUES (val1, val2, ...)[,(val1, ...

  3. TZOJ 3709:Number Maze(广搜记录前驱)

    描述 You are playing one game called "Number Maze". The map of an example is shown in the fo ...

  4. Beanstalkd消息队列的安装与使用

    一.Beanstalkd是什么? Beanstalkd是一个高性能,轻量级的分布式内存队列 二.Beanstalkd特性 1.支持优先级(支持任务插队)2.延迟(实现定时任务)3.持久化(定时把内存中 ...

  5. ES6 Proxy的应用场景

    一.相关API Proxy Reflect 二.Proxy应用场景 1.数据校验 表单提交的时候做数据校验,例如年龄是不是满足条件,数据类型是不是满足要求等等,这场场景非常适合使用Proxy. 下面展 ...

  6. hdu 5129 (枚举) The E-pang Palace

    题目;http://acm.hdu.edu.cn/showproblem.php?pid=5128. 给你n个点,问能否组成两个不相交的与坐标轴平行的矩形,能就输出两矩形的面积和,不能就输出一个字符串 ...

  7. hdu 1010(DFS) 骨头的诱惑

    http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意从S出发,问能否在时间t的时候到达终点D,X为障碍 需要注意的是要恰好在t时刻到达,而不是在t时间 ...

  8. 设置漂亮的eclipse主题(Theme)风格

    看看这些主题: Eclipse Color Themes 设置步骤: 1.点击help --> Eclipse Marketplace... 2.搜索Color Eclipse Themes 3 ...

  9. vim自动添加tags、cscope

    每次打开一个工程都需要重新添加tags.cscope,很不方便,网上找了一下. 将其添加到 ~/.vimrc 中之后,打开 vim 就会自动搜索当前路径下的tags.cscope添加进去. 自动添加 ...

  10. java如何实现发邮件功能。

    http://blog.sina.com.cn/s/blog_59ca2c2a01013800.html http://www.cnblogs.com/xdp-gacl/p/4216311.html