题目链接:传送门

参考文章:传送门

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

#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. json 相关知识

    一:json标准格式: 标准JSON的合法符号:{(左大括号)  }(右大括号)  "(双引号)  :(冒号)  ,(逗号)  [(左中括号)  ](右中括号) JSON字符串:特殊字符可在 ...

  2. 大数据入门推荐 - 数据之巅 大数据革命,历史、现实与未来等五本PDF

    扫码时备注或说明中留下邮箱付款后如未回复请至https://shop135452397.taobao.com/联系店主

  3. java发送http连接

    原生方式:@转载文章 import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamRead ...

  4. exercise 1-6

    [买菜] package Practice06; import java.io.File; import java.io.FileNotFoundException; import java.util ...

  5. 手动获取被spring管理的bean对象工具

       在netty handler开发中,我们无法将spring的依赖注入到Handler中,无法进行数据库的操作,这时候我们就需要手动获取被spring管理的bean对象:    创建一个  imp ...

  6. sqlserver中对于特定数据字段定义特定的数据类型

    char和varchar:汉字占两个字节,英文.数字或字符占一个 比如: 性别:男   女 可以定义为:char(2)或者是varchar(2)    因为性别是中文,中文占两个字节 nchar和nv ...

  7. 解决JFinal多文件上传时只获取到第一个文件名

    我的思路: 用户生成时随即生成一串随机字符作为该用户的文件上传目录,并保存该字符串到用户的某一字段.需要显示上传的附件时,遍历这个文件夹.上传时可把文件名设置为上传时间. 1.生成上传路径 可写在注册 ...

  8. [z]规则引擎

    https://www.ibm.com/developerworks/cn/java/j-drools/ 使用声明性编程方法编写程序的业务逻辑 使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性, ...

  9. git常用命令二

    http://www.jianshu.com/p/08c3f1804b36http://backlogtool.com/git-guide/cn/stepup/stepup1_1.html   git ...

  10. istio promethus收集不到数据

    1.重新apply istio.yaml kubectl apply -f install/kubernetes/istio.yaml kubectl get metrics.config.istio ...