当前位置: 首页 > news >正文

loj6515 贪玩蓝月 题解

题意:你需要维护一个双端队列。有5种操作,共进行\(q\)次:

  1. 给定\(v,w\),在队首加入一个物品,其体积为\(v\),权值为\(w\)
  2. 给定\(v,w\),在队尾加入一个物品,其体积为\(v\),权值为\(w\)
  3. 删除队首的物品。
  4. 删除队尾的物品。
  5. 给定\(l,r\),从队列中选取若干物品,在其体积之和对\(p\)\(p\)为定值)取模后在\([l,r]\)中的情况下,最大化物品的权值和。如果没有合法方案,输出\(-1\)

\(q\leq 50000,p\leq 500,0\leq w,v<10^9\)

难度:省选 NOI-

算法一(10分)

对于询问,直接暴力枚举每个书选还是不选,按题意求解最大值即可。

时间复杂度:\(O(q2^q)\)

算法二(20分)

对于每个询问,实际上是一个01背包问题。直接套用01背包的做法即可。

注意因为有取模,所以背包容量\(v\)是一个“环”,如果要压掉一维需要考虑一些细节。

时间复杂度:\(O(q^2Mod)\)

算法三(5分,测试点12)

01背包模板题。

时间复杂度:\(O(qMod)\)

算法四(15分,测试点13-15)

特殊性质是只在一端加入和删除。

本题最大的痛点之一,就是如何处理01背包的撤销。那如果换种说法呢,把撤销叫为“回到上个版本”,是不是感觉清晰多了!

我们可以稍稍参考可持久化的思想,将每次修改完后的dp数据都保存一份。那么IG(加入)就是新开了一个长为Mod的dp数组,DG(删除)就是回到了之前的某一次修改完成后的状态,这个只需要记录下每个节点的father,即栈顶撤销后回到的状态编号即可。

时间复杂度:\(O(qMod)\)

算法五(100分)

观察测试点17、18——这部分测试点的特点在于其队列的特性——每本书加入、删除的时间点都是一段连续的区间,且所有书的加入、删除时间是单调递增的。转念一想,不只是这两个测试点,对于所有的数据,每本书的存在时间都是一段连续的区间,而在做01背包时,我们并不关心这本书在书架的哪个位置,只关心它的\(p\)\(v\)

对于这种每个物品的存在时间是一段连续区间的问题,我们会想到线段树分治。我们把每个物品的存在时间求出,在线段树上做区间修改,把询问存到线段树的叶子结点,最后遍历整颗线段树,在每个节点上都开一个长为Mod的数组,做01背包,这样总的空间复杂度为\(O(qMod)\)。通过这种方式,我们巧妙规避了删除的问题,可以通过本题。

时间复杂度:\(O(qModlogq)\)

算法六(10分,测试点15,16)

考虑有没有在线做法。本题如需在线,另一个痛点是如何处理两端的同时增删。

既然合起来不好做,能否干脆将双端队列分成两个栈来做呢?

观察测试点15,16,特殊性质为\(l=r\)。也就是说,如果选取了左边的一些书,它们的特征值和对\(Mod\)取模后为\(k_左\),那么\(k_右\)是个定值。因此,只需要枚举一边的\(k\),就能得到一个确定的值,单次询问的时间复杂度为\(O(Mod)\),是ok的。

但这样又衍生出一个问题——如果一边被删光了,又要继续删,那会对另一边造成影响。但是右边又没法直接从栈底删,这该怎么办?

可以直接把另一边匀一半吗?这需要我们对整个dp数据进行重构,这个操作的时间复杂度是\(O(cnt\times Mod)\)的(\(cnt\)为当前书架上书的本数),我们可以接受吗?

答案是可以的。这里需要进行一些势能分析——

我们考虑一个变量\(\Delta=|cnt_左-cnt_右|\),即两边书本个数差的绝对值。当增/删一本书时,\(\Delta\)会变化1,这样的时间复杂度是\(O(Mod)\)的;而当某一边的\(cnt\)归零后,我们要重构整个dp数组,使得新的\(cnt_左=cnt_右\),这个操作花费的时间复杂度为\(O(cnt\times Mod=\Delta \times Mod)\),之后\(\Delta\)会归零。

由此我们发现,这个做法的时间复杂度是均摊\(O(qMod)\)的,可以接受。

算法七(100分)

现在,只剩最后一个问题了——对于\(k_左\)\(k_右\)可取的值是\(O(Mod)\)的,如果暴力枚举,那单次询问的时间复杂度将来到\(O(Mod^2)\),不能接受。

手摸一下,观察一下,可以发现,对于\(k_左\),可行的\(k_右\)是一段连续区间(如果将\([0,Mod-1]\)看成一个环形区间)。进一步观察,发现当\(k_左\)增大时,可行的\(k_右\)区间是一个固定长度的滑动窗口,使用单调队列即可均摊\(O(Mod)\)地求出对于所有的\(k_左\),最大的\(k_右\)

时间复杂度:\(O(qMod)\),如果使用带log的数据结构维护区间max的话就是\(O(qModlogMod)\)

http://www.jsqmd.com/news/239596/

相关文章:

  • 毕设分享 基于深度学习的人脸识别系统
  • 神经网络的学习(数值微分)
  • ‌2026年软件测试行业变革全景报告:AI原生范式下的角色重塑与实战路径
  • ‌2026年软件测试行业变革全景报告:AI原生范式下的角色重塑与实战路径
  • 从数值微分到梯度下降:深度学习的基石
  • 深度学习毕设选题推荐:基于python-CNN卷积网络的动物是否疲劳识别基于人工智能python-CNN卷积网络的动物是否疲劳识别
  • 全网最全8个AI论文网站,助本科生轻松搞定毕业论文!
  • 你的虚拟剑值一辆特斯拉?链游道具上链:一场让玩家“真赚钱”的成本革命
  • 【跨平台日志集中分析实战指南】:从零搭建企业级统一日志系统的5大核心步骤
  • 计算机深度学习毕设实战-基于python的卷积神经网络对大白菜是否腐烂识别基于python-CNN卷积神经网络对大白菜是否腐烂识别
  • 2026必备!本科生毕业论文神器TOP8:一键生成论文工具深度测评
  • 深度学习毕设选题推荐:基于python-CNN卷积神经网络对大白菜是否腐烂识别基于python 对大白菜是否腐烂识别
  • 隐私保护解决方案:从单人到多人的扩展实战
  • 基于大数据Hadoop+机器学习预测算法+Echarts的用户信用评估系统的设计与实现(精品源码+精品论文+上万数据集+答辩PPT)
  • 计算机毕设java高校二手商城系统 基于Java技术的高校二手交易平台设计与实现 Java环境下高校二手交易系统开发与应用
  • Kanass一文快速上手,如何快速导入Jira、Mantis数据
  • AI人脸隐私卫士应用场景:从个人到企业的解决方案
  • 计算机毕设Java基于MVC的社区党建信息系统的设计与实现 基于Java技术的社区党建信息管理平台的设计与开发 Java环境下社区党建信息系统的构建与实现
  • 1.1 揭秘AI大模型:普通人如何抓住这波技术红利?
  • (183页PPT)某省市场营销MPR+LTC流程规划方案(附下载方式)
  • Kanass一文快速上手,如何进行缺陷管理
  • Service Mesh虚拟线程深度实践(虚拟线程性能飞跃指南)
  • ‌工具对比:新兴框架评测
  • 测试语音助手可访问性:交互设计的核心挑战与系统性解决方案
  • 2026 网络安全转行全攻略:行业前景、岗位工作内容与薪资水平大揭秘
  • 自监督学习医疗数据标注效率翻倍
  • 收藏!2026年程序员必备:AI大模型实战课,突破薪资瓶颈提升核心竞争力
  • ‌政府网站可访问性测试专业实践指南:面向软件测试从业者的实战框架
  • AI人脸隐私卫士如何避免重复打码?缓存机制设计解析
  • 2026 开年亚马逊跨境“重新洗牌”:费用回调+入库更贵+小包免税暂停,卖家要从“运营”进化成“经营”