题目: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. jquery垂直滚动插件一个参数用于设置速度,兼容ie6

    利用外层的块级元素负外边距来滚动 1.使用 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://ww ...

  2. python创建迅雷批量任务

    其实不是真的创建了批量任务,而是用python创建一个文本文件,每行一个要下载的链接,然后打开迅雷,复制文本文件的内容,迅雷监测到剪切板变化,弹出下载全部链接的对话框~~ 实际情况是这样的,因为用py ...

  3. 记一次Oracle数据故障排除过程

    前天在Oracle生产环境中,自己的存储过程运行时间超过1小时,怀疑是其他job运行时间过长推迟了自己job运行时间,遂重新跑job,发现同测试环境的确不同,运行了25分钟. 之后准备在测试环境中制造 ...

  4. poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 ...

  5. java log4j 日志文件

    开发中经常会用到log日志文件,根据业务需要可能不产生很大日志文件给维护和[排错带来了麻烦.所以我们希望能够每天或每个月产生一个日志文件,这样文件不至于过大. 或者根据日志文件大小来判断,超过规定大小 ...

  6. github commit, issue, pull request, project

    1 github的提供给用户操作和交流的几个对象 commit, issue, pull request and project 2 commit and commit comment commit就 ...

  7. Upgrading Elasticsearch

    Upgrading Elasticsearch | Elasticsearch Reference [5.6] | Elastic https://www.elastic.co/guide/en/el ...

  8. Kubernetes TensorFlow 默认 特定 集群管理器

    Our goal is to foster an ecosystem of components and tools that relieve the burden of running applic ...

  9. 我的Android进阶之旅------>Android如何通过自定义SeekBar来实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在Seek ...

  10. 特殊例子--JavaScript代码实现图片循环滚动效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...