【洛谷P2894】Hotel 线段树+二分查询
题目大意:给定一个长度为 N 的序列,每个点有两种状态 1/0,表示占有和空闲,现支持 first-fit 查询是否有一段连续的长度为 X 的空闲子序列和区间赋值操作。
题解:get到了线段树新技能。。qwq
区间赋值操作和其他线段树一样,维护标记即可。
查询是否有一段连续的长度为 X 的空闲子序列只需要类似于维护区间连续最长字段即可,即:lmx,rmx,mx。first-fit 查询操作需要类似于在线段树上二分的操作,即:若左子树满足条件就走左子树,左右子树能拼接成满足需求的结果则返回,否则遍历右子树。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
int n,m,opt;
struct node{
#define ls(o) t[o].lc
#define rs(o) t[o].rc
int lc,rc;
int mx,lmx,rmx,tag; // 1 -> all zero 2 -> all one
}t[maxn<<1];
int tot,root;
inline void pushup(int o,int l,int r){
int mid=l+r>>1;
t[o].lmx=t[ls(o)].lmx==mid-l+1?t[ls(o)].lmx+t[rs(o)].lmx:t[ls(o)].lmx;
t[o].rmx=t[rs(o)].rmx==r-mid?t[ls(o)].rmx+t[rs(o)].rmx:t[rs(o)].rmx;
t[o].mx=max(t[ls(o)].rmx+t[rs(o)].lmx,max(t[ls(o)].mx,t[rs(o)].mx));
}
inline void pushdown(int o,int l,int r){
if(!t[o].tag)return;
int mid=l+r>>1;
t[ls(o)].tag=t[rs(o)].tag=t[o].tag;
t[ls(o)].lmx=t[ls(o)].rmx=t[ls(o)].mx=t[o].tag==1?mid-l+1:0;
t[rs(o)].lmx=t[rs(o)].rmx=t[rs(o)].mx=t[o].tag==1?r-mid:0;
t[o].tag=0;
}
int build(int l,int r){
int o=++tot;
if(l==r){t[o].lmx=t[o].rmx=t[o].mx=1;return o;}
int mid=l+r>>1;
ls(o)=build(l,mid),rs(o)=build(mid+1,r);
pushup(o,l,r);
return o;
}
void modify(int o,int l,int r,int x,int y,int flag){
if(l==x&&r==y){
t[o].lmx=t[o].rmx=t[o].mx=flag==1?r-l+1:0;
t[o].tag=flag;
return;
}
int mid=l+r>>1;
pushdown(o,l,r);
if(y<=mid)modify(ls(o),l,mid,x,y,flag);
else if(x>mid)modify(rs(o),mid+1,r,x,y,flag);
else modify(ls(o),l,mid,x,mid,flag),modify(rs(o),mid+1,r,mid+1,y,flag);
pushup(o,l,r);
}
int query(int o,int l,int r,int len){
if(l==r)return l;
int mid=l+r>>1;
pushdown(o,l,r);
if(len<=t[ls(o)].mx)return query(ls(o),l,mid,len);
else if(len<=t[ls(o)].rmx+t[rs(o)].lmx)return mid-t[ls(o)].rmx+1;
else return query(rs(o),mid+1,r,len);
}
int main(){
scanf("%d%d",&n,&m);
root=build(1,n);
while(m--){
scanf("%d",&opt);
if(opt==1){
int x;
scanf("%d",&x);
if(t[root].mx<x)puts("0");
else{
int l=query(root,1,n,x);
modify(root,1,n,l,l+x-1,2);
printf("%d\n",l);
}
}else if(opt==2){
int x,y;
scanf("%d%d",&x,&y);
modify(root,1,n,x,x+y-1,1);
}
}
return 0;
}
【洛谷P2894】Hotel 线段树+二分查询的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- 【洛谷】【线段树】P1886 滑动窗口
[题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...
- 洛谷 - P1198 - 最大数 - 线段树
https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 【洛谷】【线段树】P3353 在你窗外闪耀的星星
[题目描述:] /* 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀 ...
- 洛谷P5280 [ZJOI2019]线段树
https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不 ...
- 洛谷P3374(线段树)(询问区间和,支持单点修改)
洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...
- 洛谷 P2391 白雪皑皑 线段树+优化
题目描述: 现在有 \(N\) 片雪花排成一列. Pty 要对雪花进行$ M $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%N+1\) 片雪花和第\((i*q+p)%N+1\)片雪花 ...
随机推荐
- git使用遇到的问题
1.我新建了一个django项目,然后又在git上新建了一个仓库,然后我在django的项目文件内,将git上的项目clone到这个文件内的时候 git clone https://gitee.com ...
- React之生命周期函数
1.新增知识点 /* https://reactjs.org/docs/react-component.html React生命周期函数: 组件加载之前,组件加载完成,以及组件更新数据,组件销毁. 触 ...
- Delphi导出Excel的设置操作
procedure CreatRepSheet(SheetName:String;PageSize,PageLay:Integer); {新建Excel工作簿.进行页面设置} begin {新建Exc ...
- Linux配置全局jdk以及Tomcat服务器简单测试
Linux配置全局jdk 1.确保相应文件夹下有apache-tomcat和jdk的压缩文件 注意:jdk文件必须为适应Linux版本的文件 (如果已经有了相应文件,可以跳过以下第2-3个步骤) 2. ...
- java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)
1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件 准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...
- gin框架教程一: go框架gin的基本使用
我们在用http的时候一般都会用一些web框架来进行开发,gin就是这样的一个框架,它有哪些特点呢 一:gin特点 1.性能优秀2.基于官方的net/http的有限封装3.方便 灵活的中间件4.数据绑 ...
- Unity 动画属性
在动画的使用上使用不当的设置往往会造成不可预料的结果. 首先,如果动画自身可以驱动物体移动,那么在Animator组件上必须选择apply root motion,物体的动画位移才能生效,否则动画只能 ...
- ROS系统的安装以及卸载
ROS系统的安装 ROS系统的安装方式有两种,通过软件源和源码编译安装.软件源安装只需要通过简单的命令,因此,我们使用软件源来安装ROS 配置系统软件源 打开Ubuntu软件中心的软件源配置界面,勾选 ...
- 向tabcontrol中添加form
昨天花了一天的时间去找一个错误,关系是这样的,我添加一个tabcontrol就叫tc1好了,然后在tc1中再动态添加一个父窗体l叫form1,要把form1添加进tabcontrol就要先新建一个ta ...
- Jmeter 04 Jmeter变量的使用
在使用jmeter进行接口测试时,我们难免会遇到需要从上下文中获取测试数据的情况,这个时候就需要引入变量了. 定义变量 添加->配置元件->用户自定义的变量 添加->配置元件-> ...