题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592

1操作就是用线段树来二分找到第一个有 k 个0的位置。

在洛谷上A了,与暴力和网上题解对拍也都没问题。在bzoj上4msWA。不知道为什么。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls Ls[cr]
#define rs Rs[cr]
using namespace std;
const int N=2e5+,M=N<<;
int n,m,sm[M],fl[M],fr[M],mx[M],Ls[M],Rs[M],lz[M],tot;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void build(int l,int r,int cr)
{
sm[cr]=r-l+; lz[cr]=-; if(l==r)return;
int mid=l+r>>;
ls=++tot; build(l,mid,ls);
rs=++tot; build(mid+,r,rs);
}
void pshd(int cr,int l,int mid,int r)
{
if(lz[cr]==-)return;
fl[ls]=fr[ls]=mx[ls]=(lz[cr]?:mid-l+); sm[ls]=(lz[cr]?mid-l+:);
fl[rs]=fr[rs]=mx[rs]=(lz[cr]?:r-mid); sm[rs]=(lz[cr]?r-mid:);
lz[ls]=lz[rs]=lz[cr]; lz[cr]=-;
}
void pshp(int cr)
{
sm[cr]=sm[ls]+sm[rs];
fl[cr]=fl[ls]+(sm[ls]?:fl[rs]);
fr[cr]=fr[rs]+(sm[rs]?:fr[ls]);
mx[cr]=max(max(fl[cr],fr[cr]),max(mx[ls],mx[rs]));
mx[cr]=max(mx[cr],fr[ls]+fl[rs]);
}
void mdfy(int l,int r,int cr,int L,int R,bool k)
{
if(l>=L&&r<=R)
{
fl[cr]=fr[cr]=mx[cr]=(k?:r-l+); sm[cr]=(k?r-l+:);
lz[cr]=k; return;
}
int mid=l+r>>; pshd(cr,l,mid,r);
if(L<=mid)mdfy(l,mid,ls,L,R,k);
if(mid<R)mdfy(mid+,r,rs,L,R,k);
pshp(cr);
}
int qry(int l,int r,int cr,int L,int R)
{
if(l>=L&&r<=R) return sm[cr];
int mid=l+r>>,ret=; pshd(cr,l,mid,r);
if(L<=mid) ret=qry(l,mid,ls,L,R);
if(mid<R) ret+=qry(mid+,r,rs,L,R);
return ret;
}
int fnd(int l,int r,int cr,int L,int R,int k)
{
if(l==r)return l;
int mid=l+r>>; pshd(cr,l,mid,r);
if(l>=L&&r<=R)
{
int siz=mid-l+-sm[ls];
if(siz>=k)return fnd(l,mid,ls,L,R,k);
return fnd(mid+,r,rs,L,R,k-siz);
}
if(mid<L)return fnd(mid+,r,rs,L,R,k);
if(R<=mid)return fnd(l,mid,ls,L,R,k);
int d=qry(l,mid,ls,L,R);
d=mid-max(l,L)+-d;//L!!!!//max!!!!!probably just r>R
if(d>=k) return fnd(l,mid,ls,L,R,k);
return fnd(mid+,r,rs,L,R,k-d);
}
int query(int l,int r,int cr,int L,int R)
{
if(l>=L&&r<=R)return mx[cr];
int mid=l+r>>; pshd(cr,l,mid,r);
if(mid<L) return query(mid+,r,rs,L,R);
if(R<=mid) return query(l,mid,ls,L,R);
int ret=max(query(l,mid,ls,L,R),query(mid+,r,rs,L,R));
ret=max(ret,min(fr[ls],mid-L+)+min(fl[rs],R-mid));/////
}
void print()
{
for(int i=;i<=n;i++)
printf("%d ",qry(,n,,i,i));
puts("");
}
int main()
{
n=rdn(); m=rdn(); tot=; build(,n,);
for(int i=,op,l,r,l1,r1,d,k;i<=m;i++)
{
op=rdn(); l=rdn(); r=rdn();
if(!op)
{
mdfy(,n,,l,r,);
}
if(op==)
{
l1=rdn(); r1=rdn();
d=qry(,n,,l,r); if(!d)continue;
mdfy(,n,,l,r,); k=qry(,n,,l1,r1);
if(r1-l1+-k<=d) mdfy(,n,,l1,r1,);
else
{
k=fnd(,n,,l1,r1,d);
mdfy(,n,,l1,k,);
}
}
if(op==)
{
printf("%d\n",query(,n,,l,r));
}
}
return ;
}

附上暴力和maker和对拍,以便之后查。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
int n,m,ans;
bool a[N];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
int main()
{
n=rdn(); m=rdn(); for(int i=;i<=n;i++)a[i]=;
for(int i=,op,l,r,l1,r1,d;i<=m;i++)
{
op=rdn(); l=rdn(); r=rdn();
if(!op)
{
for(int j=l;j<=r;j++)a[j]=;
}
if(op==)
{
l1=rdn(); r1=rdn(); d=;
for(int j=l;j<=r;j++)d+=a[j],a[j]=;
for(int j=l1;j<=r1&&d;j++)
d-=(!a[j]),a[j]=;
}
if(op==)
{
d=; ans=;
for(int j=l;j<=r;j++)
if(!a[j])d++;
else ans=max(ans,d),d=;
ans=max(ans,d);
printf("%d\n",ans);
}
}
return ;
}

暴力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=2e5,M=;
int n,m,op,l,r;
int main()
{
srand(time());
n=rand()%N+; m=rand()%N+;
printf("%d %d\n",n,m);
for(int i=;i<=m;i++)
{
op=rand()%M;
if(op>=)op=;
l=rand()%n+; r=rand()%n+;
if(l>r)swap(l,r);
if(op==)
{
printf("%d %d %d ",op,l,r);
l=rand()%n+; r=rand()%n+;
if(l>r)swap(l,r);
printf("%d %d\n",l,r);
}
else printf("%d %d %d\n",op,l,r);
}
return ;
}

maker

#include<cstdio>
#include<algorithm>
using namespace std;
int cnt;
int main()
{
while()
{
system("./maker > data.in");
system("./a < data.in > zj.out");
system("./b < data.in > bl.out");
if(system("diff zj.out bl.out"))return ;
cnt++; printf("cnt=%d\n",cnt);
if(cnt==)return ;
}
}

对拍

bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分的更多相关文章

  1. 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)

    传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...

  2. 洛谷P4344 [SHOI2015]脑洞治疗仪(ODT)

    题意 题目链接 Sol ODT板子题. 操作1直接拆区间就行. #include<bits/stdc++.h> #define fi first #define se second con ...

  3. 洛谷 P4344 [SHOI2015]脑洞治疗仪

    题意简述 维护序列,支持以下操作: 0 l r:将l~r赋为0 1 l1 r1 l2 r2:将l1~r1中的1替换l2~r2中的0,多余舍弃 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉 ...

  4. 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树

    [BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...

  5. BZOJ 4592 SHOI2015 脑洞治疗仪 线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4592 题意概述:需要维护一个01序列A,一开始A全部都是1.支持如下操作: 1.将区间[l ...

  6. [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)

    线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...

  7. 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分

    正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...

  8. 【题解】Luogu P4344 [SHOI2015]脑洞治疗仪

    原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 ...

  9. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

随机推荐

  1. arcgis水文分析

    前言 1.在开始之前首先需要注意几点: 1.arcgis 需要 python2.7 的支持,并有必要的模块库,请一定注意避免与其他软件冲突,例如tecplot 2009 需要python2.5的支持, ...

  2. 应对ie双外边距,不使用hack

    1.在浮动元素内层加一层div 2.使用不浮动的内层外边距来定义距离 ie在浮动时,并且使用外边距,会产生双倍外边距.

  3. javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:

    javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity pas ...

  4. SkipList跳跃表(Java实现)

    取自网络https://github.com/spratt/SkipList AbstractSortedSet.java package skiplist_m; /***************** ...

  5. OOP版电子词典

    输入代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名:sum123.cpp * 作 者:林海云 * 完毕日期:20 ...

  6. C#使用for循环移除HTML标记

    public static string StripTagsCharArray(string source) { char[] array = new char[source.Length]; int ...

  7. Unix环境高级编程---信号

    参考博客:http://blog.csdn.net/alex_my/article/details/39494129 1. 信号概念 何为信号? 信号是一种软中断,可以由以下情形触发: -1: 用户按 ...

  8. C#根据Type获取默认值

    简单的获取某变量类型的默认值 在c#中为我们提供了default(),但是default的参数是具体的类名, 如何根据变量类型的Type获取默认值Code如下: 1 public static obj ...

  9. div+css清除浮动代码

    <style type="text/css"> .div1{ background:#000080; border:1px solid red;} .div2{ bac ...

  10. 我的Android进阶之旅------>Android中MediaButtonReceiver广播监听器的机制分析

    今天看公司的一段关于MediaButtonReceiver的代码看的比较混乱,幸好看了下面的这篇文章,才能茅塞顿开的理解好代码.在此转载下来,以备以后理解,希望都到这篇文章的人也能够有所帮助. 本文转 ...