题目: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. Linux QtCreator 设置mingw编译器生成windows程序

    Qt跨平台,那必须在Linux平台编译一个可以在windows下运行的Qt程序才行,当然还得和QtCreator环境弄在一起才行 工作环境:Centos 7 yum install qt5-qt* m ...

  2. uboot生成随机的MAC地址

    转载:http://blog.chinaunix.net/uid-25885064-id-3303132.html 在使用U-boot时,有个问题就是MAC地址的设置,如果MAC地址相同的两块开发板在 ...

  3. php信号处理

    pcntl pcntl_signal 信号注册函数 pcntl_alarm 指定秒数中断程序执行任务. 每次执行只会有一个定时器生效,若之前计时器还没结束就定义新定时器,会替代之前定时器并返回之前定时 ...

  4. js关于变量作为if条件的真假问题

    var a = ""; if(a){ ..... }else{ .....} 以下情况会被认为返回false: "" 空的字符串 为 0 的数字 为 null ...

  5. 将參数从PHP传递到JavaScript中

    php: //自己定义数组參数 $newarr = array('a1' => 'a1', 'a2' => 'a2', 'a3' => 'a3'); $config = CJavaS ...

  6. EasyPlayerPro(Windows)流媒体播放器开发之跨语言调用

    下面我们来讲解一下关于EasyPlayerPro接口的调用,主要分为C++和C#两种语言,C++也可以基于VC和QT进行开发,C++以VC MFC框架为例进行讲解,C#以Winform框架为例进行讲解 ...

  7. 九度OJ 1068:球的半径和体积 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5385 解决:1949 题目描述: 输入球的中心点和球上某一点的坐标,计算球的半径和体积 输入: 球的中心点和球上某一点的坐标,以如下形式输 ...

  8. python中的raw字符串

    在正则表达式的字符串前面加上r表示这个是一个raw字符串,只以正则表达式的元字符进行解析,不用理会ascii的特殊字符.

  9. 聚聚科技——php开发笔试题及答案

    聚聚科技是一个刚创立的公司,很小很小,人很少,老板感觉是个典型的北京小伙儿,戾气很重,很有个性.笔试题倒是简单: 1. echo(), print(), print_r()的区别? echo是PHP语 ...

  10. Java中的迭代迭代器Iterator与枚举器Enumeration

    Iterator 和 Enumeration区别 Iterator 和 Eumberation都是Collection集合的遍历接口,我们先看下他们的源码接口 package java.util; p ...