uer8 雪灾与外卖 题解
劲爆题。uoj 差评榜 rk3!感觉现有的题解不是很能理解,于是我尝试理解一下并写在这里给大家过目。可能在扯淡。
注意 匹配 和 增广 的区别。
假设你已经会了费用流建图。我们把链横着放,餐馆放在上面,送餐员放在下面。
先在左边加一个
加入一个送餐员的时候,可能的增广路就是从他走到前面的一个餐馆,而如果选择最短增广路,就不会有负环。加入一个餐馆的时候,没有可能的增广路,负环是替换掉之前的一个餐馆,选择最小的负环就不会产生新的负环。为了方便,以下直接用增广路指加入送餐员时产生的增广路,负环指加入餐馆时产生的负环。
问题是增广可能会进行大量的反悔。
但是画一画可以注意到一个牛逼性质。加入一个送餐员
在这个图中,我们的结论体现为,粉色增广路的左半边必然和蓝色负环的左半边重合。
为什么这是正确的?考虑如果
那么问题就是说明前面确实没有什么变化。因为
这直接给出一个做法,但是看起来跟官方题解做法不太一样,因为官方题解是把栈顶左边向左匹配的餐馆的反悔也扔进堆里了。为了说明官方题解的正确性,注意到不在栈顶的餐馆算的代价只会更大,因为栈中在它上面的餐馆又生成了若干反悔边,而反悔这些边减少的代价并没有被更新。
加入餐馆的时候走负环的性质是类似的。所以可以用两个堆分别维护最优的增广路和负环,复杂度
具体地。
-
加入一个送餐员。我们在增广路堆中找到堆顶
v ,给答案加上x+v ,并往负环堆中加入-(x+v)-x (提供一个走了反悔边的负环)。 -
加入一个餐馆。我们在负环堆中找到堆顶
v ,如果v+y+w\geq 0 则没有负环,往增广路堆中加入-y+w (提供一个没有走反悔边的增广路);否则给答案加上v+y+w ,并往增广路堆中加入-(v+y+w)-y+w (提供一个走了反悔边的增广路),往负环堆中加入-(y+w) (提供一个没有走反悔边的负环)。
对于
我感觉这个题可能做了什么双向链大一统之类的事情,但是我不知道。