题解「IOI2021」分糖果

我们把每个糖果盒子分开考虑。

我们把糖果装满成为「碰上壁」,拿完称为「碰下壁」。如果不考虑碰壁的情况,很容易算出每一时刻的糖果数。我们设第 i 时刻的糖果数为 ai(1iq)

考虑如果我们找到了这个盒子最后一次碰壁的位置,我们很容易可以算出它最后的糖果数。因为后面不用再碰壁,直接求和即可。

考虑寻找一个最大的 x,满足在区间 [x,q] 中,极差(maxmin)大于等于容量 c。仔细思考可以发现,这个区间应该恰好包含最后一次「碰上壁」和最后一次「碰下壁」。因为碰上、下壁之间,差一定大于 c

如果我们找到了这个 x,我们就可以计算出这个糖果的答案。

我们考虑从 1n 依次扫糖果。当到第 i 个糖果时,我们考虑在上一个糖果的基础上,添加以 i 开始的区间,删除以 i1 结束的区间,用线段树维护 max,min 即可。

如何找最大的 x?在线段树上二分即可。

注意实现的细节,nq 不要搞反,下标不要把 01 弄混。还要注意特判一下不会碰壁的情况。

代码记录

posted @   Little09  阅读(960)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示