題解「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