由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞。对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn)。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define N 800005
using namespace std;
int n,m,p,x,y,l,r;
int sum[N],L[N],R[N],tg[N],v[N],Ans[N],rest,Hz,ans;
void down(int k)
{
if (tg[k]!=-1)
{
int l=k<<1,r=l|1;
tg[l]=tg[r]=tg[k];
sum[l]=v[l]*tg[k];
sum[r]=v[r]*tg[k];
if (tg[k]==0) L[l]=R[l]=Ans[l]=v[l],L[r]=R[r]=Ans[r]=v[r];
else L[l]=R[l]=L[r]=Ans[l]=R[r]=Ans[r]=0;
tg[k]=-1;
}
}
void up(int k)
{
int l=k<<1,r=l|1;sum[k]=sum[l]+sum[r];
if (!sum[l]) L[k]=L[l]+L[r];else L[k]=L[l];
if (!sum[r]) R[k]=R[l]+R[r];else R[k]=R[r];
Ans[k]=max(max(Ans[l],Ans[r]),R[l]+L[r]);
}
void build(int k,int l,int r)
{
if (l==r){v[k]=1;return;}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
v[k]=v[k<<1]+v[k<<1|1];
}
void add(int k,int l,int r,int x,int y)
{
if (x<=l&&r<=y)
{
sum[k]=0;tg[k]=0;
L[k]=R[k]=v[k];
return;
}
int mid=(l+r)>>1;
down(k);
if (x<=mid) add(k<<1,l,mid,x,y);
if (y>mid) add(k<<1|1,mid+1,r,x,y);
up(k);
}
int Get(int k,int l,int r,int x,int y)
{
if (x<=l&&r<=y) return sum[k];
int mid=(l+r)>>1;
down(k);
int Ans=0;
if (x<=mid) Ans+=Get(k<<1,l,mid,x,y);
if (y>mid) Ans+=Get(k<<1|1,mid+1,r,x,y);
return Ans;
}
void fix(int k,int l,int r,int x,int y)
{
if (!rest) return;
if (x<=l&&r<=y&&rest>=v[k]-sum[k])
{
rest-=v[k]-sum[k];
tg[k]=1;Ans[k]=0;
L[k]=R[k]=0;sum[k]=v[k];
return;
}
down(k);
int mid=(l+r)>>1;
if (x<=mid) fix(k<<1,l,mid,x,y);
if (y>mid) fix(k<<1|1,mid+1,r,x,y);
up(k);
}
void qry(int k,int l,int r,int x,int y)
{
if (x<=l&&r<=y)
{
ans=max(ans,Ans[k]);
ans=max(ans,Hz+L[k]);
if (R[k]==v[k]) Hz+=R[k];else Hz=R[k];
return;
}
down(k);
int mid=(l+r)>>1;
if (x<=mid) qry(k<<1,l,mid,x,y);
if (y>mid) qry(k<<1|1,mid+1,r,x,y);
}
int main()
{
scanf("%d%d",&n,&m);
build(1,1,n);
sum[1]=v[1];tg[1]=1;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&l,&r);
if (p==0) add(1,1,n,l,r);
else if (p==1)
{
scanf("%d%d",&x,&y);
rest=Get(1,1,n,l,r);
add(1,1,n,l,r);
fix(1,1,n,x,y);
}
else
{
ans=0;Hz=0;qry(1,1,n,l,r);
printf("%d\n",ans);
}
}
return 0;
}

  

最新文章

  1. C#将数据大小字节转换为MB,GB,TB
  2. Html菜鸡大杂烩
  3. ASP.NET Core 开发-中间件(StaticFiles)使用
  4. java中 == 与 equal 的区别
  5. web app 开发必不可少的滑动插件 Flipsnap
  6. Hyper-V虚拟机和主机的网络配置
  7. 微信js-sdk,选择图片,上传,下载到本地,php服务端
  8. libvirt TLS
  9. C#开发客户端、JAVA和tomcat开发服务端
  10. JS实现等比例缩放图片
  11. [PHP]获取静态方法调用者的类名和运用call_user_func_array代入对象作用域
  12. docker pull下载镜像报错Get https://registry-1.docker.io/v2/library/centos/manifests/latest:..... timeout
  13. Mac下编译android4.0.4遇到的问题
  14. 测试一体机ASM Disk online操作
  15. 用css写出下拉框(代码转自wq群)
  16. 三维凸包求重心到面的最短距离(HDU4273)
  17. 设置OWA访问HTTP到HTTPS的重定向
  18. ELK 企业内部日志分析系统
  19. C语言入门语法
  20. The Great Pan

热门文章

  1. Kotlin – CharSequence IsNullOrBlank() vs IsNullOrEmpty()
  2. 【C语言】控制台窗口图形界面编程(四):文本输出
  3. hdfs深入:04、hdfs当中的元数据管理以及元数据节的查看
  4. [C语言]输入一行整数,用空格分开,回车结束。
  5. c++基础_特殊的数字
  6. python 多线程并发threading &amp; 任务队列Queue
  7. selenium实战演练
  8. Python中的列表(4)
  9. MySQL简单查询和单表查询
  10. C语言学习4