題目:
題解&總結:
二分答案。
判斷答案是否合法。
怎麼判斷呢?
貪心顯然不行。
那就用DP吧。
我們現在要判斷二分出來的最大間隔(憤怒值)是否合法。
我們設fi表示做到第i個作業,且做了第i個作業的最小時間。
轉移方程顯然:fi=min{fj} j=[i-x-1..i-1] 因爲上一次做的作業與這一次間隔不能超過x。
答案顯然爲ans=max{fj} j=[n-x..n]
但是,如果直接這樣DP,會時超60分。
所以我們需要加優化。
我們可以發現,轉移中的fi=min{fj} j=[i-x-1..i-1] 可以不需要枚舉都枚舉j。
其實只要維護一個區間內的最小值就可以了。
我們每次把fi-x-2丟出區間,然後得到fi後把fi加入區間。
維護區間的最小值,用堆和線段樹都可以。
我是用堆維護的,比賽時調了很久,
因爲要開兩個數組記錄堆裏面的位置與f數組裏面的位置的對應關係。
然後打着打着自己都差點被自己繞暈了。
當然,也可以用奇奇怪怪的單調隊列來優化。
聽說這題可以當做單調隊列的例題。
有興趣的可以去學學。
這題(第一題)堆維護調了近兩個小時。
第一題要不惜一切代價做對。
這是我比賽的原則。
也符合很多大型比賽的套路。
大型比賽第一題都最水。
如果大型比賽的第一題都做不對那還是回家睡覺吧。