题目: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. 吐血整理:PyTorch项目代码与资源列表 | 资源下载

    http://www.sohu.com/a/164171974_741733   本文收集了大量基于 PyTorch 实现的代码链接,其中有适用于深度学习新手的“入门指导系列”,也有适用于老司机的论文 ...

  2. 你要的最后一个字符就在下面这个字符串里,这个字符是下面整个字符串中第一个只出现一次的字符。(比如,串是abaccdeff,那么正确字符就是b了)

    include "stdafx.h" #include<iostream> #include<string> using namespace std; in ...

  3. HDFS源码分析之数据块Block、副本Replica

    我们知道,HDFS中的文件是由数据块Block组成的,并且为了提高容错性,每个数据块Block都会在不同数据节点DataNode上有若干副本Replica.那么,什么是Block?什么又是Replic ...

  4. LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解

    题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...

  5. Android studio 混淆打包问题

    参考 : Android Studio代码混淆设置以及上传mapping文件 AndroidStudio 混淆打包 在app 目录下  proguard-rules.pro中加入 通用 混淆 #指定代 ...

  6. PowerBuilder -- 结构类型(structure)

    http://bbs.csdn.net/topics/3501120743楼答复 PB的structure分两种,全局的和局部的,两者只有作用域不同. 全局的在file/new/pb object/s ...

  7. Makefile浅尝

    [0]README makefile定义: 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要一先编译,哪些文件需要后编译,哪 ...

  8. phpstorm pycharm IntelliJ IDEA激活

    phpstorm 和 pycharm server选项里边输入 http://idea.imsxm.com/ IntelliJ IDEA 1. 到网站 http://idea.lanyus.com/  ...

  9. smarty静态缓存

    缓存能让程序访问起来更加快速,调数据库的数量变少,不能实时的跟数据库同步, 一般缓存文件都放在smarty文件下cach文件夹中: 建立缓存的PHP和HTML文件: 先编辑PHP文件来查询显示数据库当 ...

  10. tps 与 事务平均响应时间关系对答(转)

    问者:每秒处理的事务数和事务的平均响应时间 怎么个关系,有关系吗 kaku21:举个例子:一个高速路 有10个入口,每个入口每秒钟只能进1辆车,请问1秒钟最多能进几辆车?? 问者:10 kaku21: ...