题解「IOI2021」分糖果
我们把每个糖果盒子分开考虑。
我们把糖果装满成为「碰上壁」,拿完称为「碰下壁」。如果不考虑碰壁的情况,很容易算出每一时刻的糖果数。我们设第 时刻的糖果数为 。
考虑如果我们找到了这个盒子最后一次碰壁的位置,我们很容易可以算出它最后的糖果数。因为后面不用再碰壁,直接求和即可。
考虑寻找一个最大的 ,满足在区间 中,极差()大于等于容量 。仔细思考可以发现,这个区间应该恰好包含最后一次「碰上壁」和最后一次「碰下壁」。因为碰上、下壁之间,差一定大于 。
如果我们找到了这个 ,我们就可以计算出这个糖果的答案。
我们考虑从 到 依次扫糖果。当到第 个糖果时,我们考虑在上一个糖果的基础上,添加以 开始的区间,删除以 结束的区间,用线段树维护 即可。
如何找最大的 ?在线段树上二分即可。
注意实现的细节, 和 不要搞反,下标不要把 和 弄混。还要注意特判一下不会碰壁的情况。
代码记录。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?