题目大意:给定一个长度为 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 线段树+二分查询的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  2. 【洛谷】【线段树】P1047 校门外的树

    [题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...

  3. 【洛谷】【线段树】P1886 滑动窗口

    [题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...

  4. 洛谷 - P1198 - 最大数 - 线段树

    https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...

  5. 【洛谷】【线段树】P1471 方差

    [题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...

  6. 【洛谷】【线段树】P3353 在你窗外闪耀的星星

    [题目描述:] /* 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀 ...

  7. 洛谷P5280 [ZJOI2019]线段树

      https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不 ...

  8. 洛谷P3374(线段树)(询问区间和,支持单点修改)

    洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...

  9. 洛谷 P2391 白雪皑皑 线段树+优化

    题目描述: 现在有 \(N\) 片雪花排成一列. Pty 要对雪花进行$ M $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%N+1\) 片雪花和第\((i*q+p)%N+1\)片雪花 ...

随机推荐

  1. 前端必须掌握的 nginx 技能(2)

    概述 作为一个前端,我觉得必须要学会使用 nginx 干下面几件事: 代理静态资源 设置反向代理(添加https) 设置缓存 设置 log 部署 smtp 服务 设置 redis 缓存(选) 下面我按 ...

  2. 使用ssh-agent管理私钥

    使用ssh-agent的好处: 如果有多台远程服务器与多个私钥文件,ssh-gent将会尝试使用不同的私钥文件建立连接,直至成功 假如有 A.B.C 三台服务器,A是控制节点,A可以直接登录B,但是无 ...

  3. Oracle 笔记(四)

    PLSQL编程[语法.plsql控制语句.异常.游标.触发器.存储过程] 1.              PLSQL的语法–块编程 a)       概念:procedural language  s ...

  4. java:easyui(jQueryEasyUI,分页)

    1.介绍: jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写复杂的ja ...

  5. crond服务总结

    昨天翻阅程序发现服务器端管理程序的启动方式很特别,在之前是由init进程启动程序脚本里的进程,昨天发现服务程序并没有在任何脚本中有启动的体现,但是服务程序确实是启动了,经过一番查找发现原来是crond ...

  6. eclipse 包含头文件出错

    最近这段时间自己在写游戏的框架,在做的过程中遇到了一个问题:没办法#include <iostream>,在eclipse下F3也找不到对应的 iostream 文件, 最后在晚上找资料, ...

  7. Unity 声音与录音与麦克风实时播放

    Unity AudioSource与MicroPhone以及AudioClip之间的关系. 下面是一个声音,长度为7秒钟,声音的实际数据本质是由采样点组成的的列表,一秒钟内的采样点数就是采样频率,下面 ...

  8. python_面试题_HTTP基础相关问题

    1.相关问题 问题1: 客户端访问url到服务器,整个过程会经历哪些 问题2: 描述HTTPS和HTTP的区别 问题3: HTTP协议的请求报文和响应报文格式 问题4: HTTP的状态码有哪些? 2. ...

  9. C语言I博客作业12

    一.我学到的内容 二.我的收获 作业链接 收获 博客第一次作业:https://www.cnblogs.com/gm12/p/11584148.html 第一次作业收获:第一次作业是我初步接触C语言的 ...

  10. MySQL数据库常用引擎

    在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 首先: 1.简单介绍这两种引擎,以及该如何去选择.2.这两种引擎所使用的数据结构是什么. 1. a.Innodb引擎,Inn ...