poj-3667(线段树区间合并)
题目链接:传送门
参考文章:传送门
思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树。
#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(线段树区间合并)的更多相关文章
- POJ 3667 线段树区间合并
http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html 用线段树,首先要定义好线段树的节点信息,一般看到一个问题,很难很 ...
- POJ 3667 线段树区间合并裸题
题意:给一个n和m,表示n个房间,m次操作,操作类型有2种,一种把求连续未租出的房间数有d个的最小的最左边的房间号,另一个操作时把从x到x+d-1的房间号收回. 建立线段树,值为1表示未租出,0为租出 ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- Poj 3667——hotel——————【线段树区间合并】
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13124 Accepted: 5664 Descriptio ...
- POJ 2482 Stars in Your Window (线段树区间合并+扫描线)
这题开始一直被矩形框束缚了,想法一直都是枚举线,但是这样枚举都需要O(n^2)...但是看了别人的思路,感觉这题思想真心很好(PS:开头好浪漫的描述啊,可惜并没有什么用) 题意就是在平面上给你一些星 ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- HYSBZ 1858 线段树 区间合并
//Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...
随机推荐
- Mac下环境变量设置错误,导致命令行命令不能使用后的解决办法
1 在命令行中,临时设置环境变量 export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 2 各种命令就可以使用了.然后修复错误的环境变量配置 ...
- nodejs项目进程管理器之pm2
如果用pm2作为nodejs的进程管理器的话,参考以下两篇文章 程序员小卡:http://www.cnblogs.com/chyingp/p/pm2-documentation.html 官方:htt ...
- 支付宝H5 与网页端支付开发
在日常生活中,我们基本上都是进行微信与支付宝的支付方式尽心支付,这种方式确实大大便利了我们的生活,那么如何在我们的产品中进行微信与支付宝支付的植入开发呢? 我们先进行支付宝的H5与网页端支付开发,这里 ...
- 实现Hibernate框架的CRUD
1.创建Web项目HS_test如图所示: 2.创建数据库DBHSTest,在数据库中创建表Teacher,并插入数据 3.在Myeclipse中调出DB Brower视图 右键->New: 连 ...
- BTC和BCH 区别和联系?
在比特币刚刚出现的时期,中本聪对区块的大小限制在1M.这种限制既保障性能较弱的个人电脑能够参与其中,同时也起到了防止攻击者让比特币网络超载的风险发生,毕竟那时系统还很脆弱.在1M的限制下,10分钟一个 ...
- [Z]scp example
https://www.cnblogs.com/autumnvivi/articles/3447964.html
- 百度地图插件(百度地图AK申请配置指南)
百度地图AK申请配置指南 [LBS云] 百度地图AK申请配置指南 1. 该文档是详细版,图文并茂: 2. 该指南是针对browser-mobile-sever三种终端开发的申请与配置说明: 3 ...
- python学习笔记Day3
set有点:1.访问速度快 2.天生解决了重复问题 tuple与set区别: 元组可重复,set不可重复创捷集合1 >>> s1.add('alex')>>> pr ...
- 5A - 超级楼梯
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? Input 输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1< ...
- MySql5.5 SQL优化 慢查询日志存储
一.MySql的慢查询日志的开启和存储 1.查看是否把没有使用索引的SQL记录到慢查询日志中,查看 log_queries_not_using_indexes 变量; show VARIABLES L ...