线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区间左边最长0连续段,右边最长0连续段,区间整体最长0连续段,区间内1的个数,以及一个记录是否被区间覆盖的懒惰标记. #include<cstdio> #include<algorithm> #define ls (x<<1) #define rs (ls|1) #defin…
[BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个01序列.1代表这个位置的脑组织正常工作,0代表这是一块脑洞. 1 0 1 0 0 0 1 1 1 0 脑洞治疗仪修补某一块脑洞的基本工作原理就是将另一块连续区域挖出,将其中正常工作的脑组织填补在这块脑洞中. (所以脑洞治疗仪是脑洞的治疗仪?) 例如,用上面第8号位置…
4592: [Shoi2015]脑洞治疗仪 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 69  Solved: 38[Submit][Status][Discuss] Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个01序列.1代表这个位置的脑组织正常工作,0代表这是一块脑洞. 1 0 1 0 0 0 1 1 1…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4592 题意概述:需要维护一个01序列A,一开始A全部都是1.支持如下操作: 1.将区间[l,r]变成0. 2.将区间[l0,r0]变成0,用其中原来1的个数去填补[l1,r1]中的0,当1的数量过多的时候剩余的1会被丢弃:当1的数量不足的时候从左到右依次填充0. 3.询问区间[l,r]中最长的0串长度.N,M<=200000. 我就直接把考试的时候写的东西弄上来了: 首先建立一颗序列线段…
考虑需要资瓷哪些操作:区间赋值为0:统计区间1的个数:将区间前k个0变为1:询问区间最长全0子串.于是线段树维护区间1的个数.0的个数.最长前缀后缀全0子串即可.稍微困难的是用一个log实现将区间前k个0变为1,线段树上二分尽量往左边改即可,可以令修改函数返回值为剩余能改的1的个数. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstrin…
题面无法直视系列. 中规中矩的线段树题. 涉及的操作有:区间赋值为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…
传送门 ODT水题. 支持区间01赋值,区间填补(把区间[l,r][l,r][l,r]从左往右数kkk个1都变成0),区间查询最长连续1个数. 思路: 区间填补操作感觉不是很好弄,写线段树的神仙可以套一个二分来写. 而对于写odtodtodt的朋友们来说就很easyeasyeasy了,直接从左往右遍历到第kkk个1所在区间覆盖一波即可(详见代码). 不会ODTODTODT的点这里 代码: #include<bits/stdc++.h> #define ri register int using…
题目: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…
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)…
原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 线段树做法好像很慢啊 我的珂朵莉树吸氧后目测luogu最优解第二,不知最优解匿名大佬怎么写的 操作1:把区间推平成0,开脑洞???珂朵莉树基本操作 操作2:把区间中的1的数量统计一下并变成0,暴力去被修补脑洞的区间填补(细节看代码来理解) 操作3:查询区间中最长连续的1,暴力扫一遍就行 #prag…