我們把每個糖果盒子分開考慮。
我們把糖果裝滿成為「碰上壁」,拿完稱為「碰下壁」。如果不考慮碰壁的情況,很容易算出每一時刻的糖果數。我們設第 \(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\) 弄混。還要注意特判一下不會碰壁的情況。
代碼記錄。