【模拟费用流】 NOI2017 蔬菜

			————蔬菜越来越多,我该怎么办???

题意

\(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)\) 个,然后越往前每天会产生 \(x_i\) 个蔬菜。

增广的过程即为丢掉某些较劣的蔬菜,卖出更优的蔬菜。
随着天数的倒退,而蔬菜的增长不会下降,即有一个贪心雏形,每次仅卖出最优的蔬菜。
堆优化后,即得到 \(O(mp^2logn)\) 的贪心。

考虑进一步优化。

复杂度瓶颈在于我们每天都重新建图,重新计算,不妨分析一下性质。
假设目前已得到 \(ans_i\) ,卖出的蔬菜集合为 \(S_i\)。要递推出 \(S_{i-1}\)

  1. 只考虑流量,则目前的流量一定能使前面的几天满流。(最优的蔬菜可以堆到前面几天卖)
  2. \(S_k\) 必然为 \(S_{k-1}\) 的子集,且缺少的元素一定为最劣的。

由性质①计算该天的退流量,维护答案由性质②即可(用堆维护答案)。
时间复杂度 \(O(mplogn)\)

posted @ 2022-03-18 15:50  Hencecho  阅读(38)  评论(0编辑  收藏  举报