bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分
题目: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]脑洞治疗仪——线段树上二分的更多相关文章
- 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...
- 洛谷P4344 [SHOI2015]脑洞治疗仪(ODT)
题意 题目链接 Sol ODT板子题. 操作1直接拆区间就行. #include<bits/stdc++.h> #define fi first #define se second con ...
- 洛谷 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的长度 题解思路 珂朵莉 ...
- 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树
[BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...
- BZOJ 4592 SHOI2015 脑洞治疗仪 线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4592 题意概述:需要维护一个01序列A,一开始A全部都是1.支持如下操作: 1.将区间[l ...
- [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)
线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...
- 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分
正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...
- 【题解】Luogu P4344 [SHOI2015]脑洞治疗仪
原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 ...
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
随机推荐
- SpringMvc aop before
1.config.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans ...
- 贷前系统ElasticSearch实践总结
贷前系统负责从进件到放款前所有业务流程的实现,其中涉及一些数据量较大.条件多样且复杂的综合查询,引入ElasticSearch主要是为了提高查询效率,并希望基于ElasticSearch快速实现一个简 ...
- 在dev目录创建一个字符设备驱动的流程
1.struct file_operations 字符设备文件接口 1: static int mpu_open(struct inode *inode, struct file *file) 2: ...
- java jdbc 同时操作查询删除操作
Connection conn = null; try { // 创建连接实例 conn = JdbcUtility.GetFactory() ...
- SQLite集成与用法
本文转载至 http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/fra ...
- 如何进行Web服务的性能测试?
随着浏览器功能的不断完善,用户量不断的攀升,涉及到web服务的功能在不断的增加,对于我们测试来说,我们不仅要保证服务端功能的正确性,也要验证服务端程序的性能是否符合要求.那么性能测试都要做些什么呢?我 ...
- spring boot 项目搭建时,各个依赖的作用
项目搭建页面 https://start.spring.io/ 各个依赖的作用 List of dependencies for Spring Boot 2.1.5.RELEASE Core DevT ...
- sqlite与sqlserver区别
1.查询时把两个字段拼接在一起 --sqlserver-- select Filed1+'@'+Filed2 from table --sqlite-- select Filed1||'@'||Fil ...
- pycharm注册码地址
(1)地址:http://idea.lanyus.com/ (2)注意,在破解的时候,是先修改hosts文件所在路径:“C:\Windows\System32\drivers\etc\hosts”,修 ...
- mooc课程mit 6.00.1x--problem set3解决方法
RADIATION EXPOSURE 挺简单的一道题,计算函数和算法过程都已经给出,做一个迭代计算就行了. def radiationExposure(start, stop, step): ''' ...