原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 线段树做法好像很慢啊 我的珂朵莉树吸氧后目测luogu最优解第二,不知最优解匿名大佬怎么写的 操作1:把区间推平成0,开脑洞???珂朵莉树基本操作 操作2:把区间中的1的数量统计一下并变成0,暴力去被修补脑洞的区间填补(细节看代码来理解) 操作3:查询区间中最长连续的1,暴力扫一遍就行 #prag…
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接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<&…
题意简述 维护序列,支持以下操作: 0 l r:将l~r赋为0 1 l1 r1 l2 r2:将l1~r1中的1替换l2~r2中的0,多余舍弃 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉树暴力赋值,查询 代码 #include <set> #include <iostream> #include <algorithm> #define IT set<Node>::iterator typedef long long ll; using std:…
题意 题目链接 Sol ODT板子题. 操作1直接拆区间就行. #include<bits/stdc++.h> #define fi first #define se second const int MAXN = 2e5 + 10; using namespace std; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-') f = -1…
[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号位置的…
前言 这道题目呢,看上去很难,实际上我们可以用线段树解决这道题目. 正文 我们维护 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 就是左子树和右子…
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]\),分别表示一个区间内从左开始和从右开始的最长子串,于是就可以合并啦 之后第二个操作看起来很唬…
题目: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…