四毛子算法与+-1RMQ

四毛子算法与+-1RMQ前言 cf 群里 有人提了一个线段树区间连续 1 不带修改的问题 Claris 口胡一个 O n O 1 的做法 于是来学习一下思路来源 https www cnblogs com whx1003 p 13996517 html 知识总结四毛子算法是一种暴力分块的思想 1RMQ 是其应用之一 1RMQ 问题 O n O 1 1RMQ 问题是这么一个问题 仍然询问区间的 RMQ 但是这个序列有着特殊的性质 即相邻项之差要么是 1 要么是 1 于是 有如下的暴力思想 先分块

前言

cf群里,有人提了一个经典问题,

0,形如这样的01序列,每次询问[l,r]间出现最多的连续1的个数,

区间连续1,不带修改的问题,都不带修改了,所以可以考虑更优的方法,

Claris口胡一个O(n)-O(1)的做法,于是来学习一下

思路来源

https://www.cnblogs.com/whx1003/p/13996517.html

知识总结

四毛子算法是一种暴力分块的思想,+-1RMQ是其应用之一

①+-1RMQ问题(O(n)-O(1))

+-1RMQ问题是这么一个问题,仍然询问区间的RMQ,

但是这个序列有着特殊的性质,即相邻项之差要么是-1,要么是+1,

于是,有如下的暴力思想,先分块,每一块大小为B,则分为n/B块,

对于每一块的+-1情况,二进制枚举讨论,这里以最大值为例,

这样就能判断出来最大值的位置,多个位置选择其中一个即可,

对于这n/B块,每块存了一个最大值,运用朴素ST表的思想,

这样的复杂度就是O(2^B+\frac{n}{B}*log\frac{n}{B})

为了复杂度最优,我们取B=\left \lceil \frac{logn}{2} \right \rceil,则原复杂度为O(n)级别

其实这个B值,似乎取B=logn的时候更小,

可能考虑到实现的时候还带常数吧,实践意义上除以个2更优

这样就做到了O(n)的预处理,O(1)的查询

②O(n)-O(1)查询树上两点的lca

先求出原树的欧拉序,

注意到欧拉序只有相邻深度的变化,

即深度的变化只有+-1,这样就可以套用+-1RMQ的方法,

欧拉序求a和b的lca时,需要求第一次出现a的位置和第一次出现b的位置间深度最小值的点,

于是这便可以对原序列进行+-1RMQ查询

③O(n)-O(1)求一个任意序列的RMQ

先对原序列扫一遍,建笛卡尔树,

就转化为树上问题,再套用+-1RMQ的方法,

即可实现求任意序列的RMQ

后续

考虑原问题,0011100这样的序列,

先转化一步把0合并,转化为01110,

再转化一步,把连续1压到一起,变为030,

但是这不满足+-1的渐变过程,所以考虑补出一些项来,变为0,

这相比原序列来说,最多扩展为原长的二倍,因此是可行的,

对于询问的[l,r]来说,可能两端的段不是完整包含的,

这个预处理一下,

对于每个位置的1,与其位于同一个尺取段内的最后位置,

和与其位于同一个尺取段内的最初位置,即可实现两端点的特判

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200971.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:13
下一篇 2026年3月20日 上午10:13


相关推荐

  • cockpit二次开发_laravel api

    cockpit二次开发_laravel api背景:最近公司要基于cockpit,来定制自己的一个服务器管理web应用。嗯。。cockpit是啥?能干嘛?我要拿它干嘛?如你所见,我此刻是懵逼的。cockpit了解我熟练的打开了百度又打开了bing哦吼,二度懵逼。经过几番了解,大概是知道了LinuxCockpit是一个基于Web界面的应用,它提供了对系统的图形化管理。因为功能集成,对服务器管理来说,可以称得上是神器,深受linux开发者的喜爱。(呵呵。。)最后我大概是知道了,公司就是想让我在人..

    2025年7月27日
    6
  • WebSocket原理及技术简介

    WebSocket原理及技术简介WebSocket 原理及技术简介目录 1 nbsp nbsp nbsp nbsp 引言 nbsp nbsp nbsp nbsp 12 nbsp nbsp nbsp nbsp WebSocket 技术及协议 nbsp nbsp nbsp nbsp 2 2 1 nbsp nbsp nbsp nbsp WebSocketAPI nbsp nbsp nbsp nbsp 2 2 1 1 nbsp nbsp nbsp nbsp 示例 nbsp nbsp nbsp nbsp 3 2 2 nbsp nbsp nbsp nbsp WebSocket 协议 nbsp nbsp nbsp nbsp 4 2 2 1 nbsp nbsp nbsp nbsp 握手阶段 nbsp nbsp nbsp nbsp 4 2 2 2 nbsp nbsp nbsp nbsp 数据通信 nbsp nbsp nbsp nbsp 5 2 2 3 nbsp nbsp nbsp nbsp 连接关闭

    2026年3月19日
    1
  • kafka的应用场景有_后端用到kafka的地方

    kafka的应用场景有_后端用到kafka的地方kafka作为一个消息流处理平台。很多开发人员都作它作为一个生产&消费的中间件,并没有细细去思考kafka可以在哪些应用场景中使用,下面根据我的经验,总结下kafka可以应用在以下场景中。消息队列这种场景是日常用得最多之一。我日常需要将多台服务器上的日志集中收集到一个点上,通过logstash进行扫描并发到kafka队列中,然后通过消费者程序进行消费写到hbase或者es中。…

    2022年10月14日
    4
  • s一般怎么称呼自己的m_英文信的开头和结尾,怎么写才不会出错?

    s一般怎么称呼自己的m_英文信的开头和结尾,怎么写才不会出错?一提起写英文信,很多人觉得很简单,不就是开头叫声dear,结尾说句sincerely吗?但其实,根据不同的情况,前后都会有特殊的要求。我们要怎么写才不会出错呢?首先,说一种我们最熟悉的情况,就是当你明确知道对方姓名的时候,我们应该如何写开头和结尾。正式的写法就是dear后面加上具体称呼,比如马丁先生“Mr.Martin”,这时候应该写他的姓氏(surname)。Mr.即Mister的缩写,意思是…

    2022年6月23日
    119
  • endnote转化成纯文本后_EndNote X7如何去掉域代码生成纯文本文件

    endnote转化成纯文本后_EndNote X7如何去掉域代码生成纯文本文件满意答案czpunk2016.08.17采纳率:58%等级:9已帮助:2963人现在很多杂志都要求作者提供电子文稿。格式化后的文稿含有大量域代码,有可能与杂志社的软件不兼容,因此提交前需要去掉文稿里的域代码。方法是从Word的工具栏里进入“EndNote7.0”子菜单选择点击“RemoveFieldCodes”,出现一个提示框告诉你“该操作将创建一个新的去掉了所有域代码的Word文档,…

    2022年5月28日
    58
  • pjsip编译

    pjsip编译pjsip 编译主要是找到编译器路径 Xcode5 开始所有版本 系统的 gcc 整合到 xcrun 中了 需要用参数来区分在 pjlib include pj 目录下增加 con

    2025年10月26日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号