uoj455 UER#8 雪灾与外卖

【题目】

直线上有\(n\)个送餐员和\(m\)个餐厅。每个送餐员都要去餐厅取菜,花费为距离\(+\)菜的价值。每个餐厅有提供菜数量限制,求最小花费。

【解题思路】

神题啊。

以下用老鼠表示送餐员,洞表示餐厅。

首先大概思路是用堆来模拟费用流,具体来说,首先不考虑复杂度的我们把每个洞拆成\(c_i\)个洞,把老鼠和洞放在一起排序从左往右处理,同时维护两个堆,老鼠堆存的是已经匹配的老鼠的反悔,也就是说老鼠堆中的老鼠都是已经匹配了的,洞堆存储的是洞的反悔和还没有用的洞。

但是这个时候有一个问题就是按说老鼠必须都进洞,所以洞反悔的话必然会有一个老鼠无法进洞,于是我们先在无限靠左的地方加入\(n\)个代价无穷的洞,然后如果有老鼠无法匹配就先让老鼠和这些洞匹配,显然如果有合法方案的话这些洞一定不会出现在最终的方案中。

如果我们当前处理的是一个老鼠,那就从洞堆中取一个最小的匹配,同时把他的反悔放入老鼠堆中,具体来说反悔的值\(val\)应该满足\((y[b]+val+w[b])+(x[k]-y[a]+w[a])=y[b]-x[k]+w[b]\)\(val=-2x[k]-(-y[a]+w[a])\),但是此时洞不能反悔因为不然的话当前这个老鼠就无法匹配了。

如果我们当前处理的是一个洞,那么我们就挑一个老鼠反悔掉之前的匹配,把那个老鼠和这个洞匹配,同时把这个老鼠的反悔放入老鼠堆中,此时\(val\)满足\((y[b]+val+w[b])+(y[a]-x[k]+w[a])=y[b]-x[k]+w[b]\)\(val=-(y[a]+w[a])\),然后把这个洞的反悔放入堆中,但是有一个问题就是为什么这个时候洞就可以反悔了,这是因为如果这个时候洞反悔了抛弃了这个老鼠相当于老鼠保持了原来的匹配,依旧能让每个老鼠都进洞,本质上反悔了两次,这个时候\(val\)满足\((x[k']+val)+(y[a]+val'+w[a])+(x[k]-y[a']+w[a'])=(x[k']-y[a]+w[a])+(x[k]-y[a']+w[a'])\)\(k'\)是反悔后匹配的老鼠,\(k\)是之前匹配的老鼠,\(a\)是当前洞,\(a'\)\(k\)反悔前匹配的洞,\(val'=-2x[k]-(-y[a']+w[a'])\)即反悔的值)即\(val=-2y[a]-val'\)

对于洞的容量很大的情况,可能出现一种情况就是很多的老鼠不停反悔去选择之后的洞,但是这个时候我们会发现反悔时\(val=-(y[a]+w[a])\),也就是说这些一起反悔的老鼠之后就是等价的了,于是用一个\(pair\)第二维记录一下等价的老鼠个数,那么也就是说如果在某个洞那里有多个返回的老鼠他们就会被合并,显然合并的次数是\(O(n)\)的,于是这个操作的次数也是\(O(n)\)的。

猜你喜欢

转载自www.cnblogs.com/11111111234kkk/p/10742743.html