脑洞治疗仪
P4344 [SHOI2015] 脑洞治疗仪
翻译题目
-
:区间置 。 -
:将 中的 取出,填到 (从左到右填入,多出去的扔掉)。 -
,查询区间内最大连续 的长度。
思路
我们考虑维护类似于最大子段和的信息:(1)左边连续 0
、(2)右边连续 0
、(3)答案、(4)长度、(5)1
的个数。
为了方便,定义
更新:
- 如果
有 ,那么肯定不可能穿透到 ,就是 的(1);否则, 的长度+ 的(1)。 - 如果
有 ,那么肯定不可能穿透到 ,就是 的(2);否则, 的长度+ 的(2)。 - l答案、r答案、l(2)+r(1)最大者。
- 不更新。
- 相加。
操作1:懒标记,直接更新。
操作2:二分找到可以填充的最右边的位置,然后操作1+区间置1。
操作3:询问若干个区间,然后像3一样合并答案,需要注意l(2),r(1)不能超出询问的区间边界。
我们可以写一个函数模拟填入的过程。
如果区间对应的只有左子树或右子树,直接填就行。
如果两个都有,我们先填左子树,再把剩下的给右子树填。
每次发现一个区间可以直接填时直接填,然后懒标记与操作2中的区间置1一样,打懒标记是
这样复杂度就少了一个log。
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17744559.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步