UOJ #455.【UER #8】雪灾与外卖 堆模拟费用流

题意

有n个人和m家商店,每个人都要买一道菜。第i个人的坐标是a[i],第j家商店的坐标是y[i],有c[i]道菜且每道菜价格为w[i],每个人还要花费其到商店距离的路费,问最小花费。
n , m ≤ 1 0 5 , a [ i ] , y [ i ] , c [ i ] , w [ i ] ≤ 1 0 9 n,m\le10^5,a[i],y[i],c[i],w[i]\le10^9 n,m105,a[i],y[i],c[i],w[i]109

分析

显然可以费用流做,但跑不过。
考虑把商店和人放到一起按坐标排序,然后从左往右扫,然后不断维护当前的最优解。但当前最优解可能并不是全局最优解,所以还要维护撤销操作。
更具体的讲,对人和商店分别用一个堆来维护,堆中权值表示我要将当前商店或人空置出来并与新加入的人或商店匹配需要付出的最小代价。当新加入一个人时就选择一个最优的商店匹配;新加入一个商店时则尽可能的撤销之前的操作并使答案变得更优。
再加一个小优化,把费用相同的撤销操作放到一起,复杂度就是正确的了。
时间复杂度 O ( n l o g n ) O(nlogn)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值