RainAir
My OI Blog
RainAir
「NOIP2015」运输计划
「NOIP2015」运输计划

题目描述

L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球。

小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。

为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。

在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。

如果小 P 可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段性工作所需要的最短时间是多少?

数据范围

https://blog.aor.sd.cn/wp-content/uploads/2018/11/20160427173647306.png

解题报告

题意:给定一棵有n个节点的树(带有边权),再给定m条树中的路径。允许将一条树边的权改为0,并使得这些路径的最长距离最小。输出该修改方案中这些路径中最长的一条。
注意最长的路径最小,我们就想到了二分答案。
那么怎么检查答案呢?
首先,我们要二分这些路径中的最长路径,设为k
如果有某一路径的距离大于k,那么我们显然就要修改这个路径中的边。就把这些路径标记起来,然后找一条都覆盖的边。如果有某一条边能满足边权值权值 >= 最长路径-k,那么这个答案k是可行的。
那么怎么要找出来这些覆盖的边呢?
当树退化为一条链时,当然是差分好了。
对于我们的路径i,设起点a[i]b[i]l[i] = LCA(a[i],b[i])那么我们就可以让差分数组f[a[i]]++,f[b[i]]++,f[l[i]] -= 2
那么最后,数据中提到了注意常数因子的影响
那么我们要注意以下几点:
1. 尽量使用快读
2. 用Vector的同学改为邻接表或前向星
3. 缩小二分范围
4. Tarjan好像更快(我没试过)

代码

赞赏
知识共享许可协议
本文链接: https://blog.aor.sd.cn/archives/130
如文中无特殊声明,本文采用 CC BY-NC-SA 4.0 进行许可,转载请说明出处!
希望 CSP 不要翻车,希望省选不要翻车
https://secure.gravatar.com/avatar/97c17c68a1e55e11bb5558bc0f10cc0d?s=256&d=mm&r=g

RainAir

文章作者

一个OIer。

发表评论

textsms
account_circle
email

RainAir

「NOIP2015」运输计划
题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球。 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:…
扫描二维码继续阅读
2018-04-14
标签
近期评论