【[SHOI2015]脑洞治疗仪】】的更多相关文章

原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 线段树做法好像很慢啊 我的珂朵莉树吸氧后目测luogu最优解第二,不知最优解匿名大佬怎么写的 操作1:把区间推平成0,开脑洞???珂朵莉树基本操作 操作2:把区间中的1的数量统计一下并变成0,暴力去被修补脑洞的区间填补(细节看代码来理解) 操作3:查询区间中最长连续的1,暴力扫一遍就行 #prag…
[BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个01序列.1代表这个位置的脑组织正常工作,0代表这是一块脑洞. 1 0 1 0 0 0 1 1 1 0 脑洞治疗仪修补某一块脑洞的基本工作原理就是将另一块连续区域挖出,将其中正常工作的脑组织填补在这块脑洞中. (所以脑洞治疗仪是脑洞的治疗仪?) 例如,用上面第8号位置…
题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位置的脑组织正常工作,00代表这是一块脑洞. 1 0 1 0 0 0 1 1 1 0 脑洞治疗仪修补某一块脑洞的基本工作原理就是将另一块连续区域挖出,将其中正常工作的脑组织填补在这块脑洞中.(所以脑洞治疗仪是脑洞的治疗仪?) 例如,用上面第88号位置到第1010号位置去修补第11号位置到第44号位置的…
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #include<cstdio> #include<iostream> #define N 200001 using namespace std; #define max(x,y) ((x)>(y) ? (x) : (y)) #define min(x,y) ((x)<(y)…
我太sb啦 合并的时候又漏了,又漏了,又漏了 我个sb 这是个板子题,并不知道为什么SHOI2015会考这么板子的题,但是我又sb了,又sb了,又sb了,又没有1A 显然我是凉了 这道题有三个操作 区间清零 将一个区间清零,之后补到另一个区间去,但是有可能补不满 询问一个区间内最大全零子串 显然这都是线段树的板子操作,对于维护这种区间最长的连续的子串,我们只需要多维护两个数组\(rc[i],lc[i]\),分别表示一个区间内从左开始和从右开始的最长子串,于是就可以合并啦 之后第二个操作看起来很唬…
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #include<cstdio> #include<set> #define IT set<node>::iterator using std::set; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<&…
由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞.对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn). #include<iostream> #include<cstdio> #include<cstdlib> #define N 800005 using namespace std; int n,m,p,x,y,l,r; int sum[N],L[N],R[N],tg[N],v[N],Ans[…
前言 这道题目呢,看上去很难,实际上我们可以用线段树解决这道题目. 正文 我们维护 sum.len.tag.lmax.rmax.ans. sum 就是这段区间非脑洞的个数 len 就是这段区间的长度 tag 就是我们的 lazy_tag lmax 就是从左开始的连续脑洞个数 rmax 就是从右开始的连续脑洞个数 ans 就是这段区间最大的连续脑洞 建树 由于 len 是不变的,所以我们可以建树的时候就求出 len t[num].len=r-l+1; pushup sum sum 就是左子树和右子…
题面无法直视系列. 中规中矩的线段树题. 涉及的操作有:区间赋值为0,计算区间内1的个数,区间赋值为1,求区间内最大的连续的1的个数. #include<cstdio> #include<iostream> #include<cstring> using namespace std; ,mxnode=maxn<<; int lc[mxnode],rc[mxnode],sz[mxnode],num0[mxnode],mxl0[mxnode],mxr0[mxno…
嘟嘟嘟 这题其实就是一个线段树维护最大连续和的水题. 别的操作不说,操作1只要二分找区间前\(k\)个0即可. 需要注意的是,因为操作1两区间可能有交,因此要先清空再二分查询-- 复杂度\(O(n log ^ 2 n)\). #include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<cstdlib>…