题解「IOI2021」分糖果


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

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

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

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

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

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

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

注意实现的细节,\(n\)\(q\) 不要搞反,下标不要把 \(0\)\(1\) 弄混。还要注意特判一下不会碰壁的情况。

代码记录


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM