【LOJ6405】「ICPC World Finals 2018」征服世界
【题目链接】
- 点击打开链接
【思路要点】
- 建议参考 W C 2019 WC2019 WC2019 第一课堂陈江伦的《模拟费用流问题》课件。
- 我们称需要军队的地方为老鼠,军队为洞,那么我们可以花费一定代价移动老鼠和洞,使得所有老鼠均进洞,我们需要最小化总代价。
- 考虑使用贪心解决该问题,我们为每一只老鼠设定一个额外代价 − ∞ -\infty −∞ ,其中 − ∞ -\infty −∞ 是一个足够小的数,表示将该老鼠和某一个洞匹配后额外的代价。由于我们会最小化总代价,因此这样将保证所有老鼠均进洞,我们只需把最后的答案加上 + ∞ × M +\infty\times M +∞×M ,其中 M M M 为老鼠个数即可。
- 记节点 i i i 到根的距离为 d e p t h i depth_i depthi ,树上 L c a Lca Lca 为 z z z 的点 x , y x,y x,y 之间的路径长度为 d e p t h x + d e p t h y − 2 × d e p t h z depth_x+depth_y-2\times depth_z depthx+depthy−2×depthz 。考虑在 z z z 子树中的所有老鼠和洞,我们关心的仅仅是 d e p t h x , d e p t h y depth_x,depth_y depthx,depthy 的数值,而不关心它们具体在哪里。不难发现,上述额外代价也可以直接与 d e p t h x depth_x depthx 或 d e p t h y depth_y depthy 进行累加后看做老鼠和洞的固有属性,不妨记为 v a l u e x , v a l u e y value_x,value_y valuex,valuey 。
- 每当我们找到可以使当前总代价减小的匹配,即 v a l u e x + v a l u e y − 2 × d e p t h z < 0 value_x+value_y-2\times depth_z<0 valuex+valuey−2×depthz<0 的匹配,匹配之,答案将会变优。但这样找到的匹配很可能不是最终答案上的匹配,因此我们需要提供一个反悔的可能。考虑撤销本次匹配的代价,我们可以重新计算得到新的 v a l u e x ′ = 2 × d e p t h z − v a l u e y ′ , v a l u e y ′ = 2 × d e p t h z − v a l u e x value'_x=2\times depth_z-value'_y,value'_y=2\times depth_z-value_x valuex′=2×depthz−valuey′,valuey′=2×depthz−valuex 。
- 至此,我们可以得出本题的算法,即从叶子结点出发,向上进行贪心。用两个小根堆来维护子树内 v a l u e x , v a l u e y value_x,value_y valuex,valuey 的集合,在合并两棵子树的同时合并它们对应的堆。当堆顶元素满足 v a l u e x + v a l u e y − 2 × d e p t h z < 0 value_x+value_y-2\times depth_z<0 valuex+valuey−2×depthz<0 时更新答案,并删除堆顶元素,加入 v a l u e x ′ , v a l u e y ′ value'_x,value'_y valuex′,valuey′ 。
- 可以发现,若一对已经在 z z z 处匹配的老鼠和洞同时反悔,那么 z z z 的父边将会被老鼠正反经过两次,因此不反悔是更优的,从而不可能出现同时反悔的情况。那么,元素入堆的总次数将为 O ( X ) O(X) O(X) 级别,总时间复杂度 O ( X L o g X ) O(XLogX) O(XLogX) 。
- 可将堆中相同的元素并为一个,时间复杂度优化至 O ( N L o g N ) O(NLogN) O(NLogN) 。
【代码】
#include<bits/stdc++.h> #include<ext/pb_ds/priority_queue.hpp> using namespace std; const int MAXN = 3e5 + 5; const long long INF = 1e12; 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(""); } ll ans, depth[MAXN]; vector <pair <int, int>> a[MAXN]; int n, m, cnthole[MAXN], cntmouse[MAXN]; __gnu_pbds :: priority_queue <ll, greater<ll>> hole[MAXN], mouse[MAXN]; void work(int pos, int fa, int len) {depth[pos] = depth[fa] + len;while (cnthole[pos]--) hole[pos].push(depth[pos]);while (cntmouse[pos]--) mouse[pos].push(depth[pos] - INF);for (auto x : a[pos])if (x.first != fa) {work(x.first, pos, x.second);hole[pos].join(hole[x.first]);mouse[pos].join(mouse[x.first]);}while (!mouse[pos].empty() && !hole[pos].empty() && mouse[pos].top() + hole[pos].top() - 2 * depth[pos] < 0) {ll m = mouse[pos].top(), h = hole[pos].top(), s = m + h - 2 * depth[pos];ans += s; mouse[pos].pop(), hole[pos].pop();mouse[pos].push(m - s), hole[pos].push(h - s);} } int main() {read(n);for (int i = 1; i <= n - 1; i++) {int x, y, z; read(x), read(y), read(z);a[x].emplace_back(y, z);a[y].emplace_back(x, z);}for (int i = 1; i <= n; i++) {read(cnthole[i]), read(cntmouse[i]);int tmp = min(cnthole[i], cntmouse[i]);cnthole[i] -= tmp, m += cntmouse[i] -= tmp;}work(1, 0, 0);writeln(ans + INF * m);return 0; }
【LOJ6405】「ICPC World Finals 2018」征服世界相关推荐
- [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)
2021-09-07 test [TJOI2013]拯救小矮人 「ICPC World Finals 2019」Hobson 的火车 [TJOI2013]拯救小矮人 luogu4823 考试题目的数据 ...
- 「ICPC World Finals 2019」何以伊名始(广义后缀自动机)
题目链接 题解: 对输入的trie图建立SAM,然后将询问反转,这个串对应的点的endpos集合就是答案. 还挺水的(逃 AC代码: #pragma GCC optimize(2) #include& ...
- 专访京东副总裁翁志:全方位解读 CNCC 2018「数据开创商业新生态」技术论坛 | CNCC 2018...
雷锋网 AI 科技评论按:电子商务在中国高速发展的十余年中,为零售行业在成本.效率和体验上带来了颠覆式的发展.而近年来人工智能技术的发展,又带来了零售业态的新升级,即线上与线下零售逐渐走向融合,零售终 ...
- 「九省联考 2018」一双木棋
「九省联考 2018」一双木棋 题目描述 菲菲和牛牛在一块 \(n\) 行 \(m\) 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满 ...
- LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】
6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- 重磅!CSDN 发布「AI开源贡献奖Top5」「AI新锐公司奖Top10」「AI优秀案例奖Top30」三大榜单...
2020 年无疑是特殊的一年,AI 在开年的这场"战疫"中表现出惊人的力量.站在"新十年"的起点上,CSDN发起[百万人学AI]评选活动.我们继续聚焦AI的技术 ...
- 2019 ICPC EC Finals C. Heretical … Möbius(中国剩余定理,序列检验)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2018 ICPC EC Finals C. Heretical - Möbius Weblink h ...
- 马斯克矩阵模拟错了?这个试验证明人类不是「缸中之脑」
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来源:外媒 编辑:LQ [导读]你相信马斯克的矩阵模拟吗?还是相信人类是生活在现实世界 ...
最新文章
- 网卡的7种bond模式
- Java当中的常量池
- linux中文件的合并、归档、和压缩
- flex java 上传下载_完整的Flex多文件上传实例
- CppUnit源代码分析总结
- 联想Y700键盘失灵问题
- 经典面试智力题200+题和解答
- TeamTalk编译和部署(一)
- 【身份证识别】基于模板匹配算法实现二代身份证号码识别系统含Matlab源码
- 2020山东大学软件测试期末试题
- ESXi主机从6.7升级到ESXi 7.0.3后无法识别Emulex LPe12000 HBA卡
- 下载igs对流层延迟(ZTD)产品
- poco mysql 安装_linux 下 POCO 安装
- “双花”问题及解决之道
- excel根据条件列转行_如何将excel里的一列数据转为一行 excel数据列转行的办法步骤...
- 计算机程序无法启动,应用程序无法正常启动,教您电脑应用程序无法正常启动0xc000007b怎么解决...
- 英语会话必须掌握的五种基本结构[转]
- canopen6.0-PDO发送
- ScreenToGIF工具分享--将视频转成GIF动图
- Kindeditor环境搭建(JSP)
热门文章
- matlab为什么生成obj文件,为文件输入和输出创建新的 System object
- 华为机试C语言-整形数组按个位值排序
- javaweb JAVA JSP药品销售管理系统JSP医药销售管理系统JSP购物商城系统JSP电子商务系统JSP购物系统
- C# Combox设置只读
- java new Filereader_Java FileReader类 - Java 教程 - 自强学堂
- C语言 文件读写的实现
- IOS7 系统下的UIScrollView偏移问题
- 有哪些免费的思维导图软件?分享两个制作软件给你
- 单体架构、SOA和微服务
- Android 点击查看大图(长按保存图片)