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 把[ ...
随机推荐
- bootstrap-table 使用遇到的问题总结
问题一:右上角button样式自定义 方法: //修改bootstrap-table右上角按钮样式 $(".table-box .columns-right button").re ...
- iOS开发时使用的bundle路径
bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBu ...
- swift - 快速代码块 - 创建 tableview等一些控件 基本属性
1.创建tableview private lazy var cellId = "cellId" fileprivate lazy var tv : UITableView = { ...
- swift - 解析三方 - ObjectMapper
// // JYQueryBespeakModel.swift // rtb // // Created by chen on 2018/3/30 // 查询预约信息 import UIKit imp ...
- linux命令学习之:vim
1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器. 虽然emacs是公认的世界第一,我认为使用emacs并没有使用vi进行编辑来得高效. 如果是初学vi,运行一下vimtu ...
- Redis 中 redis.conf配置详细解析
########################################### 基本配置 ##################################### # 端口 port 666 ...
- 读取properties文件的信息
1.properties配置文件的信息 fcsimage_path=C://FCSImage 2.Java代码 public final class Config { private static f ...
- mysql中各种join连表查询总结
通常我们需要连接多个表查询数据,以获取想要的结果. 一.连接可以分为三类: (1) 内连接:join,inner join (2) 外连接:left join,left outer join,righ ...
- Linux系统安装过程
一.安装VMware® Workstation 14 Pro,有一些安装时会出现virtual XT的错误,这需要重启电脑进入BIOS,开户虚拟加速开关:有些win8/10会出现虚拟网卡安装失败的情况 ...
- C++树的插入和遍历(关于指针的指针,指针的引用的思考)
题目 写一个树的插入和遍历的算法,插入时按照单词的字典顺序排序(左边放比它"小"的单词,右边放比它"大"的单词),对重复插入的单词进行计数. 程序源码 #inc ...