Luogu 🟡 P1714 切蛋糕
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 P1714 切蛋糕
Problem Statement
題目簡述
給定長度為 的序列,每個位置有一個幸運值。
小 Z 最多只能吃 塊蛋糕,請在所有長度至少為 且不超過 的連續子區間中,找出區間和的最大值。
形式化地,找一段子段 且 ,最大化 。
Constraints
約束條件
- 保證答案的絕對值在 之內
思路:前綴和 + 滑動窗口最小值(單調佇列)
1. 從題目本質開始
本題本質上是在 P1115 最大子段和 或 53. Maximum Subarray 的基礎上,加上了區間大小的限制。
回顧一下在前述題目中,我們是如何最大化一段連續區間的和的?其中一種做法是把「區間和」改寫成「兩個前綴和的差」。即令前綴和 表示前 個元素的總和(特別地,令 ),那麼任意區間 之和為 。
不過本題多了一個限制:區間長度至少需要為 且不能超過 。換成前綴和的下標,就是:
2. 固定右端點,問題變成找最小前綴和
固定 時,想讓 最大,就等價於在所有允許的 中,找 最小者。
根據上述限制,允許的 範圍是:
所以每個 都需要快速得到「最近 個前綴位置內(且必須小於 )的前綴和最小值」。這就是滑動視窗最小值問題。
關鍵結論
對每個右端點,只需要知道視窗內的最小前綴和位置,答案就是 。
3. 用單調佇列維護視窗最小值
用一個雙端佇列存「候選左端點的前綴下標」,並保持它們對應的前綴和遞增:
- 視窗往右移時,把已經不可能再用的下標(小於 的)從隊首移除。
- 此時隊首就是當前視窗內前綴和最小的位置,可用來更新答案。
- 為了維持遞增性,準備把當前前綴位置放入前,先把隊尾所有「前綴和不小於目前值」的下標移除,因為它們未來永遠不會比目前值更優。
更新順序(避免空區間)
由於區間長度至少為 ,當前右端點對應的前綴位置不能當作左端點使用。
因此流程必須是:先用既有候選左端點更新答案,再把當前前綴位置加入佇列。
複雜度分析
- 時間複雜度:
- 空間複雜度:
Code
1 | from collections import deque |
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus





![Luogu 🟡 P3467 [POI 2008] PLA-Postering](https://i.gdst.dev/cover/P3467.webp)
![Luogu 🟡 P7910 [CSP-J 2021] 插入排序](https://i.gdst.dev/cover/P7910.webp)
![Luogu 🟡 P3143 [USACO16OPEN] Diamond Collector S](https://i.gdst.dev/cover/P3143.webp)
![Luogu 🟡 P4653 [CEOI 2017] Sure Bet](https://i.gdst.dev/cover/P4653.webp)


![Luogu 🟢 P2216 [HAOI2007] 理想的正方形](https://i.gdst.dev/cover/P2216.webp)
![Luogu 🟢 P2671 [NOIP 2015 普及组] 求和](https://i.gdst.dev/cover/P2671.webp)


