【模擬費用流】 NOI2017 蔬菜
阿新 • • 發佈:2022-03-18
————蔬菜越來越多,我該怎麼辦???
題意
有 \(n\) 種蔬菜,第 \(i\) 種蔬菜初始有 \(c_i\) 個單位,每天會有 \(x_i\) 個單位
變質,賣出每一單位的收益為 \(a_i\) ,且第一次賣出時還能額外獲得
收益 \(s_i\)。
你每天可以賣出最多 \(m\) 個單位的蔬菜。
求銷售 \(k\) 天的最大收益。
對於所有的\(1 ≤ k ≤ p\),分別求出答案。
做法
樸素拆點費用流 \(O(nmp^2)\) 較為容易,對於初次賣出的約束,建立一個容量為 \(1\) 的新點即可。
考慮增廣的本質。
雖然直接按照題意來還是略微辣手的,不妨倒著列舉時間。
蔬菜在某一時刻出現了 \(x'_i(x'_i\leq x_i)\)
增廣的過程即為丟掉某些較劣的蔬菜,賣出更優的蔬菜。
隨著天數的倒退,而蔬菜的增長不會下降,即有一個貪心雛形,每次僅賣出最優的蔬菜。
堆優化後,即得到 \(O(mp^2logn)\) 的貪心。
考慮進一步優化。
複雜度瓶頸在於我們每天都重新建圖,重新計算,不妨分析一下性質。
假設目前已得到 \(ans_i\) ,賣出的蔬菜集合為 \(S_i\)。要遞推出 \(S_{i-1}\)
- 只考慮流量,則目前的流量一定能使前面的幾天滿流。(最優的蔬菜可以堆到前面幾天賣)
- \(S_k\) 必然為 \(S_{k-1}\) 的子集,且缺少的元素一定為最劣的。
由性質①計算該天的退流量,維護答案由性質②即可(用堆維護答案)。
時間複雜度 \(O(mplogn)\)