我们把每个糖果盒子分开考虑。
我们把糖果装满成为「碰上壁」,拿完称为「碰下壁」。如果不考虑碰壁的情况,很容易算出每一时刻的糖果数。我们设第 \(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\) 弄混。还要注意特判一下不会碰壁的情况。
代码记录。