ABC388DEG 题解

news/2025/1/12 23:45:12/文章来源:https://www.cnblogs.com/dengstar/p/18667635

ABC388 题解

ABCDE+G,rk 371。

D

观察到几个性质:

  1. 一个人只会在成年的时候得到石头,在成年之后给出石头。
  2. \(i\) 个人成年之后,他要给之后的每个人一个石头(除非用光了)。也就是说,假设成年时它的石头数量为 \(B_i\),则最终他的石头数量为 \(\max(0, B_i - (n - i))\)

因此我们只需计算每个人在成年时会得到几个石头。这等价于询问他之前的人中,有多少人的石头数量 \(> 0\)。计算的方法很多。我在第 \(i\) 个人成年后,把 \(B_i + i\) 放到一个小根堆中,这个数就表示他能给到第几个人。(\(+ i\) 是为了统一)。统计第 \(i\) 个人成年时能得到几个石头,就弹出小根堆中所有 \(< i\) 的值,之后小根堆的大小就代表他能获得的石头数量。时间复杂度 \(O(n \log n)\),当然还有一些简单的线性做法。

不过这个做法还是稍微要点脑子,我也不保证我一定能想出来。我们有更直接的做法:直接模拟给石头的过程,用树状数组优化就行,只是码量略大。还是那句话:观察到的性质越多,代码就可以写得越简单。

E

结论:如果存在一个大小为 \(x\) 的匹配,那它一定可以表示为一个长为 \(x\) 的前缀和一个长为 \(x\) 的后缀匹配(即第 \(i\) 个元素匹配第 \((n - x + 1)\) 个元素)。

这个结论比较容易猜,但我不会严格证明。

有了这个结论之后,可以简单地用二分来得到答案。但实际上我们有线性做法,并且这个做法可以扩展到 G 的回滚莫队:

固定左端点 \(L = 1\),右端点 \(R\)\(1\) 开始向右扩展,每次扩展时尝试更新当前的最大匹配 \(cnt\) 的值,\(R\) 扩展到 \(N\)\(cnt\) 即为答案。(起初 \(cnt = 0\)。)这个结论是此做法的基础:我们只要知道最大匹配的大小,就能确定它的形态(即哪个元素和哪个元素匹配),这样就不用去记录匹配的形态。\(R\) 扩展到 \(R + 1\) 时,判断 \(cnt\) 是否会 \(+1\)。我们只需判断 \(A_{cnt + 1} \le 2A_{R - cnt - 1}\) 是否成立即可。有一个 corner case:当 \(cnt\) 的大于区间长度的一半就不用尝试更新 \(cnt\) 了,因为此时 \(cnt\) 不会变大。

G

区间询问,不强制在线,我们可以考虑用莫队来解决。根据 E 的线性做法,已经知道如何 \(O(1)\) 扩展,但如何删除呢?我们发现,要判断删除一个端点后 \(cnt\) 会不会 \(-1\),等价于判断:对于区间内长度为 \(cnt\) 的前缀和等长的后缀,前缀和后缀内的第 \(i\) 个数能否一一匹配,这似乎不太好维护。(实际上这可以转化为一个 RMQ 问题,见这篇题解。但能想到这个做法的话就不用莫队了)

但是我们还是能用莫队来做!对于这种扩展容易、删除困难的问题,可以用一种叫做“回滚莫队”的改版莫队来解决。这种算法可以在不能删除区间端点的情况下解决问题,并且时间复杂度和莫队一样都是 \(O(n \sqrt n)\)(假设询问次数 \(q\) 和序列长度 \(n\) 同阶,下同。)

还是把序列分成 \(B\) 块。对于每个询问,如果其左右端点在同一块,我们就暴力扩展处理,这样对于单个询问,时间复杂度是 \(O(n / B)\) (由于其左右端点在同一块,所以区间长度不超过 \(n / B\)。)否则,把询问按左端点所在的块分类,对于左端点在同一块的询问,我们一起处理。

具体而言,对于左端点在同一块内的询问,先按右端点大小从小到大排序。然后,还是用 \(L,R\)\(cnt\) 表示当前处理的区间左右端点,和区间内最大匹配的大小。对于左端点在第 \(i\) 块的询问,初始化 \(L, R\) 为第 \(i\) 块的右端点,然后不断令 \(R\) 向右扩展。扩展到 \(R = j\) 时,如果有某个询问的左端点在第 \(i\) 块,而右端点为 \(j\),我们就处理这个询问。此时,\(R\) 已经到位了,但左端点还在原位,那么我们让左端点向左扩展,直到其到位为止。由于一开始 \(L\) 在第 \(i\) 块的右端点,所以 \(L\) 一直往左移动就能到位。但移动之后,对于之后的询问,\(L\) 可能就在它的左端点的左边了,而我们又不能删除,那怎么办呢?这里就是回滚莫队的精髓了:在 \(L\) 移动之前,我们先记录下移动前的 \(cnt\)。移动之后,直接把 \(L\)\(cnt\) 修改为原来的值,就可以 \(O(1)\) 地回到移动前的状态,这就是“回滚”。于是,对于每个询问,我们都能保证 \(L\) 在其左端点的右边,这就规避了删除操作。

时间复杂度分析:处理左端点在一个块内的询问时,\(R\) 是单调增的,最多移动 \(n\) 次;对于每个询问,\(L\) 最多移动 \(n / B\) 次。因此处理左右端点不同块的询问,时间复杂度为 \(O(nB + \dfrac{n^2}{B})\),取 \(B = \sqrt{n}\) 最优,时间复杂度为 \(O(n \sqrt n)\)。而处理左右端点同块元素的时间复杂度是相同的,因此这就是回滚莫队的时间复杂度。

参考代码

(回滚莫队练习题)「JOISC 2014 Day1」历史研究

这不是这场 ABC 的题,但刚学回滚莫队,把这道题就一起放这里了吧。

这道题扩展是容易的,因为序列中的数都是正数,所以一个数的重要值单调不降,整个区间的最大重要值也单调不降,因此每次更新一个数的重要值后,都可以尝试用它来更新区间的最大值。但删除是困难的,因为一个数的重要值单调不升,而原先的区间最大值变小之后难以快速更新。扩展容易删除难,这就是回滚莫队典型的应用场景。

在回滚莫队中,除了区间的扩展,还有一个重要的部分是回滚。这道题的回滚比 G 稍微复杂一些(但也还好):扩展之后,重要值数组会更新。如果我们拷贝整个重要值数组,回滚的时候再赋值回来,时间复杂度接受不了。不妨用一个 vector 记录下将要扩展的区间的数当前的重要值,回滚的时候重新赋值就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868416.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qwen2ForSequenceClassification文本分类实战和经验分享

本文主要使用Qwen2ForSequenceClassification实现文本分类任务。 文章首发于我的知乎:https://zhuanlan.zhihu.com/p/17468021019 一、实验结果和结论 这几个月,在大模型分类场景做了很多实验,攒了一点小小经验。 1、短文本 1)query情感分类,一般不如BERT ps:结论和,htt…

Ubuntu22.04 解决 E: 无法定位软件包 yum

1、修改 sudo vim /etc/apt/sources.list的内容,将下文内容增加至该文件中:deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu…

【安全运营】第6年实践总结

一、安全运营全景图 安全运营全景图调整的原因:一是公司在文化、部门、人员方面调整,导致有些部分不再适用;二是2024年针对安全运营规划开会讨论过多次,部分逻辑和内容有变化;三是安全运营工作范围有变化,需要进行合并、增加;四是经过2024年的实践,个人的观点有变化,需…

如何使用 Logstash 8 连接 Easysearch

背景 很多小伙伴都在使用 Logstash ,随着各家安全扫描、安全策略的加固,不少小伙伴已经开始使用 Logstash 8 了。在使用 Logstash 8 连接 Easysearch 的时候可能会遇到问题,比如下图。提示连接的不是兼容版本的 Elasticsearch 。 解决方法有两种 两种方法对 Logstash 和 Log…

【Raspberry PI】Raspberry PiSP摄像头前端(rpl-cfe)

1.PiSP相机前端 PiSP 摄像头前端 (CFE) 是一个将 CSI-2 接收器与 一个简单的 ISP,称为前端 (FE)。 CFE 有四个 DMA 引擎,可以从四个单独的流写入帧 从 CSI-2 接收到内存。也可以路由其中一个流 直接给 FE 做最少的图片处理,写两个版本 (例如,未缩放和缩小版本)将接收…

一文看懂“高大上”的边缘计算!!

一、边缘计算(Edge Computing) 边缘计算是一种分布式计算架构,其核心思想是将计算、存储和数据处理任务从云端推到靠近数据源的设备或网络边缘。通过这种方式,数据可以在本地(离数据源更近的地方)进行处理,从而减少延迟、减轻带宽负担、提高处理效率,并降低对远程数据中…

使用 CompletableFuture 实现异步编程

使用 CompletableFuture 实现异步编程 在现代 Java 开发中,异步编程是一项重要使用 CompletableFuture 实现异步编程 在现代 Java 开发中,异步编程是一项重要技能。而 CompletableFuture 是从 Java 8 开始提供的一个功能强大的工具,用于简化异步任务的编写和组合。本文将详细…

PCIe总线-存储器域和PCIe总线域访问流程分析(二)

1.概述 PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于PCIe总线域。存储器域访问PCIe总线域或者PCIe总线域访问存储器域,需要经过一系列的转…

在Windows上调试iOS Safari中的H5页面

本次开发的web页面需要适配移动端,第一个版本在发布到线上,发现ios设备一直打不开网页,无论是自带的safari浏览器还是其他浏览器,页面经常出现“***页面重复出现错误”,但是在本地以及使用PC浏览器模拟都没有复现该问题。为了进行线上的调试查询了一下如何在windows上调试…

大模型AI应用场景及产品汇总(持续更新)

一、文生图 1. Napkin AINapkin AI 可以基于输入的文本生成各种图示,例如流程图、逻辑关系图等等。https://app.napkin.ai/

大模型AI应用场景汇总(持续更新)

一、文生图 1. Napkin AINapkin AI 可以基于输入的文本生成各种图示,例如流程图、逻辑关系图等等。https://app.napkin.ai/

G1原理—5.G1垃圾回收过程之Mixed GC

大纲 1.Mixed GC混合回收是什么 2.YGC可作为Mixed GC的初始标记阶段 3.Mixed GC并发标记算法详解(一) 4.Mixed GC并发标记算法详解(二) 5.Mixed GC并发标记算法详解(三) 6.并发标记的三色标记法 7.三色标记法如何解决错标漏标问题 8.SATB如何解决错标漏标问题 9.重新梳理Mixed …