和最大子段和的思路是一样的,可以记 \(lmax,rmax,dat\) 分别表示从当前区间最靠左/右的最大连续空子段和当前区间的最大连续空子段。

需要用延迟标记,每次遇到开房操作先ask,如果能找到就修改这一段。

注意更新节点时要讨论左/右区间是否全部空/非空。

#include <cstdio>
#include <algorithm>
using namespace std; const int N=5e4;
struct Edge
{
int l,r,dat,lmax,rmax,tag;
#define l(x) t[x].l
#define r(x) t[x].r
#define tag(x) t[x].tag
#define len(x) (t[x].r-t[x].l+1)
}t[(N<<2)+5];
int n,m; void build(int rt,int l,int r)
{
l(rt)=l,r(rt)=r;
t[rt].dat=t[rt].lmax=t[rt].rmax=r-l+1;
if(l==r) return;
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
} inline void pushdown(int rt)
{
if(!tag(rt)) return;
tag(rt<<1)=tag(rt<<1|1)=tag(rt);
t[rt<<1].dat=t[rt<<1].lmax=t[rt<<1].rmax=tag(rt)==1?0:len(rt<<1);
t[rt<<1|1].dat=t[rt<<1|1].lmax=t[rt<<1|1].rmax=tag(rt)==1?0:len(rt<<1|1);
tag(rt)=0;
} int ask(int rt,int x)
{
pushdown(rt);
if(l(rt)==r(rt)) return l(rt);
if(t[rt<<1].dat>=x) return ask(rt<<1,x);
int mid=l(rt)+r(rt)>>1;
if(t[rt<<1].rmax+t[rt<<1|1].lmax>=x) return mid-t[rt<<1].rmax+1;
return ask(rt<<1|1,x);
} void change(int rt,int l,int r,int tag)
{
if(l<=l(rt)&&r>=r(rt))
{
t[rt].dat=t[rt].lmax=t[rt].rmax=tag==1?0:len(rt);
tag(rt)=tag; return;
}
pushdown(rt);
int mid=l(rt)+r(rt)>>1;
if(l<=mid) change(rt<<1,l,r,tag);
if(r>mid) change(rt<<1|1,l,r,tag);
if(t[rt<<1].dat==len(rt<<1))
t[rt].lmax=len(rt<<1)+t[rt<<1|1].lmax;
else t[rt].lmax=t[rt<<1].lmax;
if(t[rt<<1|1].dat==len(rt<<1|1))
t[rt].rmax=len(rt<<1|1)+t[rt<<1].rmax;
else t[rt].rmax=t[rt<<1|1].rmax;
t[rt].dat=max(max(t[rt<<1].dat,t[rt<<1|1].dat),t[rt<<1].rmax+t[rt<<1|1].lmax);
} int main()
{
scanf("%d%d",&n,&m);
build(1,1,n);
for(int i=1,op;i<=m;++i)
{
scanf("%d",&op);
if(op==1)
{
int x; scanf("%d",&x);
if(t[1].dat>=x)
{
int l=ask(1,x);
printf("%d\n",l);
change(1,l,l+x-1,1);
}
else puts("0");
}
else
{
int l,x; scanf("%d%d",&l,&x);
change(1,l,l+x-1,2);
}
}
return 0;
}

最新文章

  1. MySQL数据的主从复制、半同步复制和主主复制详解
  2. Markdown: 用写代码的思维写文档
  3. 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
  4. [Android Tips] 17. Check APK Sign Info
  5. [Effective JavaScript 笔记]第65条:不要在计算时阻塞事件队列
  6. Python之Django--ORM连表操作
  7. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图
  8. Python 基础语法
  9. linux 搭建pptpd vpn(转,备忘)
  10. 高效 jquery 的奥秘
  11. jquery 弹出层
  12. CC++初学者编程教程(8) VS2013配置编程助手与QT
  13. java基础练习 9
  14. c语言_头文件_stdlib
  15. 不同版本的mysql字符集的默认编写
  16. js 原型链的介绍
  17. Git常用命令集锦
  18. iOS Runtime(一)、objc_class深深的误解
  19. oracle实用命令入门
  20. yii 缓存的使用 以及使用需要开启php的apc扩展

热门文章

  1. 面试官就是要问我SpringMVC的源码,差点顶不住!
  2. k8s-记一次安全软件导致镜像加载失败
  3. Spring Boot WebFlux-02——WebFlux Web CRUD 实践
  4. 理解Spring:IOC的原理及手动实现
  5. Java编程技巧:if-else优化实践总结归纳
  6. 在Visual Studio 中使用git——同步到远程服务器-下(十二)
  7. external-provisioner源码分析(1)-主体处理逻辑分析
  8. 配置中心之Nacos简介,使用及Go简单集成
  9. 流程自动化RPA,Power Automate Desktop系列 - 发布文档中心
  10. 重新整理 .net core 实践篇————跨域问题四十一]