【题目链接】

  • 点击打开链接

【思路要点】

  • 建议参考 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」征服世界相关推荐

  1. [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)

    2021-09-07 test [TJOI2013]拯救小矮人 「ICPC World Finals 2019」Hobson 的火车 [TJOI2013]拯救小矮人 luogu4823 考试题目的数据 ...

  2. 「ICPC World Finals 2019」何以伊名始(广义后缀自动机)

    题目链接 题解: 对输入的trie图建立SAM,然后将询问反转,这个串对应的点的endpos集合就是答案. 还挺水的(逃 AC代码: #pragma GCC optimize(2) #include& ...

  3. 专访京东副总裁翁志:全方位解读 CNCC 2018「数据开创商业新生态」技术论坛 | CNCC 2018...

    雷锋网 AI 科技评论按:电子商务在中国高速发展的十余年中,为零售行业在成本.效率和体验上带来了颠覆式的发展.而近年来人工智能技术的发展,又带来了零售业态的新升级,即线上与线下零售逐渐走向融合,零售终 ...

  4. 「九省联考 2018」一双木棋

    「九省联考 2018」一双木棋 题目描述 菲菲和牛牛在一块 \(n\) 行 \(m\) 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满 ...

  5. LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】

    6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...

  6. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  7. 重磅!CSDN 发布「AI开源贡献奖Top5」「AI新锐公司奖Top10」「AI优秀案例奖Top30」三大榜单...

    2020 年无疑是特殊的一年,AI 在开年的这场"战疫"中表现出惊人的力量.站在"新十年"的起点上,CSDN发起[百万人学AI]评选活动.我们继续聚焦AI的技术 ...

  8. 2019 ICPC EC Finals C. Heretical … Möbius(中国剩余定理,序列检验)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2018 ICPC EC Finals C. Heretical - Möbius Weblink h ...

  9. 马斯克矩阵模拟错了?这个试验证明人类不是「缸中之脑」

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来源:外媒 编辑:LQ [导读]你相信马斯克的矩阵模拟吗?还是相信人类是生活在现实世界 ...

最新文章

  1. 网卡的7种bond模式
  2. Java当中的常量池
  3. linux中文件的合并、归档、和压缩
  4. flex java 上传下载_完整的Flex多文件上传实例
  5. CppUnit源代码分析总结
  6. 联想Y700键盘失灵问题
  7. 经典面试智力题200+题和解答
  8. TeamTalk编译和部署(一)
  9. 【身份证识别】基于模板匹配算法实现二代身份证号码识别系统含Matlab源码
  10. 2020山东大学软件测试期末试题
  11. ESXi主机从6.7升级到ESXi 7.0.3后无法识别Emulex LPe12000 HBA卡
  12. 下载igs对流层延迟(ZTD)产品
  13. poco mysql 安装_linux 下 POCO 安装
  14. “双花”问题及解决之道
  15. excel根据条件列转行_如何将excel里的一列数据转为一行 excel数据列转行的办法步骤...
  16. 计算机程序无法启动,应用程序无法正常启动,教您电脑应用程序无法正常启动0xc000007b怎么解决...
  17. 英语会话必须掌握的五种基本结构[转]
  18. canopen6.0-PDO发送
  19. ScreenToGIF工具分享--将视频转成GIF动图
  20. Kindeditor环境搭建(JSP)

热门文章

  1. matlab为什么生成obj文件,为文件输入和输出创建新的 System object
  2. 华为机试C语言-整形数组按个位值排序
  3. javaweb JAVA JSP药品销售管理系统JSP医药销售管理系统JSP购物商城系统JSP电子商务系统JSP购物系统
  4. C# Combox设置只读
  5. java new Filereader_Java FileReader类 - Java 教程 - 自强学堂
  6. C语言 文件读写的实现
  7. IOS7 系统下的UIScrollView偏移问题
  8. 有哪些免费的思维导图软件?分享两个制作软件给你
  9. 单体架构、SOA和微服务
  10. Android 点击查看大图(长按保存图片)