【题目链接】

  • 点击打开链接

【思路要点】

  • 首先判断是否无解,以下讨论默认问题有解。
  • 令 ∞\infty∞ 为一个足够大的数,对于送餐员 XiX_iXi​ ,在 Xi−∞X_i-\inftyXi​−∞ 处增加 111 个餐馆,令所有送餐员初始时与其对应的餐馆匹配,即初始时 Ans=N∗∞Ans=N*\inftyAns=N∗∞ 。
  • 从左到右考虑每一个元素,加入当前的考虑集合。
  • 若加入元素为送餐员 XXX ,那么我们可以找到之前一个的一个餐馆 (Y,w)(Y,w)(Y,w) 与之匹配,其代价为 X−Y+wX-Y+wX−Y+w ,因此,我们应当找到一个尚未匹配的 −Y+w-Y+w−Y+w 最小的餐馆。这样的匹配不一定是全局最优的,因此我们应当加入 “撤销” 功能,即对于将来的某个餐馆,它可能选择取消本次的匹配,转而与该送餐员匹配,因此,我们分别用两个堆来维护可以匹配的餐馆和送餐员。
  • 若加入元素为餐馆,则可以在使答案更优的情况下尽可能地取消之前的匹配,同时,我们也需要考虑取消本次的匹配与后面的送餐员、餐馆匹配的可能性,详见以下代码。
  • 在下列代码中,堆 TTT 中元素个数在每次加入一个元素后的增量为 O(1)O(1)O(1) ,而每当 SSS 中加入 xxx 个元素, TTT 中就会减少 O(x)O(x)O(x) 个元素,因此堆中操作的总数是 O(N)O(N)O(N) 的。
  • 时间复杂度 O((N+M)Log(N+M))O((N+M)Log(N+M))O((N+M)Log(N+M)) 。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
const long long INF = 1e18;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); }
template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f;
}
template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {write(x);puts("");
}
int n, m, tot;
pair <int, pair <int, int>> a[MAXN];
priority_queue <pair <ll, int>> s, t;
int main() {read(n), read(m);for (int i = 1; i <= n; i++)read(a[i].first);tot = n;ll sum = 0;for (int i = n + 1; i <= n + m; i++) {read(a[++tot].first);read(a[tot].second.first);read(a[tot].second.second);sum += a[tot].second.second;if (a[tot].second.second == 0) tot--;}if (sum < n) {puts("-1");return 0;}ll ans = n * INF;sort(a + 1, a + tot + 1);for (int i = 1; i <= tot; i++) {int pos = a[i].first, price = a[i].second.first, cnt = a[i].second.second;if (cnt != 0) {int used = 0;while (cnt != 0 && !t.empty() && pos + price - t.top().first < 0) {int now = min(t.top().second, cnt);ans += (pos + price - t.top().first) * now;cnt -= now, used += now;s.emplace(pos * 2 - t.top().first, now);if (t.top().second == now) t.pop();else {pair <ll, int> tmp = t.top();t.pop(), t.emplace(tmp.first, tmp.second - now);}}if (cnt != 0) s.emplace(pos - price, cnt);if (used != 0) t.emplace(pos + price, used);} else {if (!s.empty() && pos - s.top().first - INF < 0) {ans += pos - s.top().first - INF;t.emplace(pos * 2 - s.top().first, 1);if (s.top().second == 1) s.pop();else {pair <ll, int> tmp = s.top();s.pop(), s.emplace(tmp.first, tmp.second - 1);}} else t.emplace(pos + INF, 1);}}writeln(ans);return 0;
}

【UOJ455】【UER #8】雪灾与外卖相关推荐

  1. [UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

    题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c ...

  2. UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)

    题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...

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

    题意 有n个人和m家商店,每个人都要买一道菜.第i个人的坐标是a[i],第j家商店的坐标是y[i],有c[i]道菜且每道菜价格为w[i],每个人还要花费其到商店距离的路费,问最小花费. n,m≤105 ...

  4. 仿美团外卖的全栈项目(vue+node+mongodb)带支付-大三求实习

    关于 2019届大三学生,前段时间一直想一个人单独开发一个较为完整的项目,在众多应用中,考虑之后选择了美团外卖来模仿,这段时间就利用课余时间进行开发,前端用vue+vuex+vue-router+ax ...

  5. 美团十年,支撑最大规模外卖配送的一站式机器学习平台如何炼成?

    作者 | 艳伟,美团配送技术团队资深技术专家 编辑 | 唐小引 题图 | 东方 IC AI 是目前互联网行业炙手可热的"明星",无论是老牌巨头,还是流量新贵,都在大力研发 AI 技 ...

  6. 浙大读博八年现靠送外卖赚钱,本人:进组以来博士无一人按时毕业

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 杨净 发自 凹非寺 量子位 | 公众号 QbitAI 浙大在读博士, ...

  7. 程序员加班崩溃,过路外卖小哥主动帮忙改代码,网友直呼太暖了!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 有人说,成年人的崩溃总在一瞬间. 近日,一段青岛外卖小哥帮程序员写代 ...

  8. 高考623分却说自己是“反面教材”?外卖小哥最新发声!

    ‍‍‍‍‍‍‍‍‍ 点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达   近日 95年出生的"外卖小哥&qu ...

  9. 北大博士干了半年外卖骑手,写出 AI 伦理论文登上顶刊,“系统知道一切”

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 外卖骑手 ...

最新文章

  1. Maven build标签
  2. linux sed错误sed: -e expression #1, unknown option to `s'解决办法
  3. kettle大数据量读写mysql性能优化
  4. please wait while windows configures microsoft visual studio professional 2013
  5. 江苏信息考试access_2016年江苏省信息技术学业水平测试Access操作题
  6. 三级pc技术_EeIE智博会展商推荐鑫路远—专业从事液控设备的研发、生产和销售的高新技术企业...
  7. Python小白的数学建模课-02.数据导入
  8. 修改MySQL自动递增值
  9. 【华为云技术分享】低代码开发平台发展趋势:低代码——炒作还是趋势?
  10. vb html table,VB6.0 如何是用 datatable
  11. Spring.Net的AOP的通知
  12. KDD China技术峰会回顾:大牛云集,教你如何基于大数据 手握人工智能未来
  13. 颜宁谈为何选择深圳:一拍即合!我麻溜地向普林斯顿递了辞职申请
  14. 前方高能!阿里云双11拼团百团大战已开启!
  15. connection reset by beer问题排查
  16. 【SDOI2015】星际战争 网络流
  17. pubwin扫描安装
  18. 计算机工程与科学北京,高强铝合金加速腐蚀方法的研究-计算机工程与科学-北京航空航天大学.PDF...
  19. 推荐适合新手入门的音频剪辑软件推荐
  20. 微信付费进群收费进群系统源码 底部会显示价格(可自定义)入群

热门文章

  1. java panel 左对齐,JPanel左对齐
  2. 判断手机是否处于静音、震动、正常模式
  3. 初识Vulkan渲染管线
  4. duilib设置透明窗口_使用duilib开发半透明异形窗体程序(补充)
  5. ASP.NET MVC身份认证与授权
  6. 【iOS】设置背景渐变色
  7. cie1931 python绘制_科学网-gnuplot与CIE1931 XYZ三刺激值曲线-范学良的博文
  8. CLion Executable和Library区别
  9. 加装ssd固态硬盘基本要求
  10. python咋变汉语_Python3实现汉语转换为汉语拼音