题目背景

公元 \(2044\) 年,人类进入了宇宙纪元。

题目描述

公元\(2044\) 年,人类进入了宇宙纪元。

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

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

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

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

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

输入输出格式

输入格式:

第一行包括两个正整数 \(n, m\),表示 \(L\) 国中星球的数量及小 \(P\) 公司预接的运输计划的数量,星球从 \(1\) 到 \(n\) 编号。

接下来 \(n-1\) 行描述航道的建设情况,其中第 \(i\) 行包含三个整数 \(a_i, b_i\)​ 和 \(t_i\)​,表示第 \(i\) 条双向航道修建在 \(a_i\)​ 与 \(b_i\)​ 两个星球之间,任意飞船驶过它所花费的时间为 \(t_i\)​。数据保证 \(1 \leq a_i,b_i \leq n\)且 \(0 \leq t_i \leq 1000\)。

接下来 \(m\) 行描述运输计划的情况,其中第 \(j\) 行包含两个正整数 \(u_j\)​ 和 \(v_j\)​,表示第 \(j\) 个运输计划是从 \(u_j\)​ 号星球飞往 \(v_j\)​号星球。数据保证 \(1 \leq u_i,v_i \leq n\)

输出格式:

一个整数,表示小 \(P\) 的物流公司完成阶段性工作所需要的最短时间。

输入输出样例

输入样例#1:

6 3

1 2 3

1 6 4

3 1 7

4 3 6

3 5 5

3 6

2 5

4 5

输出样例#1:

11

题解

二分答案+树上差分

显然,这个答案是具有单调性的,那么我们就可以二分答案

考虑如何写check呢?

设当前check(x)

f[u] 表示 u到它父亲这条路径被超过长度x的线路经过次数

首先我们记下长度超过x的线路数量为cnt,并把该路径经过的边 f 加1(树上差分)

然后如果存在一条边经过次数等于cnt,且最长的线路长度减去它的长度小于等于x 就可以

Code

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. using namespace std;
  5. inline int gi() {
  6. int f = 1, s = 0;
  7. char c = getchar();
  8. while (c != '-' && (c < '0' || c > '9')) c = getchar();
  9. if (c == '-') f = -1, c = getchar();
  10. while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
  11. return f == 1 ? s : -s;
  12. }
  13. const int N = 300010;
  14. struct node {
  15. int to, next, w;
  16. }g[N<<1];
  17. int last[N], gl;
  18. inline void add(int u, int v, int w) {
  19. g[++gl] = (node) {v, last[u], w};
  20. last[u] = gl;
  21. return ;
  22. }
  23. struct zz {
  24. int to, id;
  25. };
  26. vector<zz> q[N];
  27. int cx[N], cy[N], fa[N], lca[N];
  28. inline int find(int x) {
  29. return fa[x] == x ? x : fa[x] = find(fa[x]);
  30. }
  31. bool vis[N];
  32. int ff[N], dep[N], fl[N], cnt;
  33. void tarjan(int u, int f) {
  34. vis[u] = 1;
  35. for (int i = last[u]; i; i = g[i].next) {
  36. int v = g[i].to;
  37. if (v == f) continue;
  38. fl[v] = g[i].w;
  39. dep[v] = dep[u]+g[i].w;
  40. tarjan(v, u);
  41. fa[v] = u;
  42. }
  43. for (RG int i = 0; i < (int) q[u].size(); i++)
  44. if (vis[q[u][i].to] && !lca[q[u][i].id])
  45. lca[q[u][i].id] = find(q[u][i].to);
  46. return ;
  47. }
  48. int MAX;
  49. void dfs(int u, int f) {
  50. for (RG int i = last[u]; i; i = g[i].next) {
  51. int v = g[i].to;
  52. if (v == f) continue;
  53. dfs(v, u);
  54. ff[u] += ff[v];
  55. }
  56. if (cnt == ff[u] && fl[u] > MAX) MAX = fl[u];
  57. return ;
  58. }
  59. int m;
  60. bool check(int x) {
  61. cnt = 0;
  62. int len = 0;
  63. memset(ff, 0, sizeof(ff));
  64. for (RG int i = 1; i <= m; i++)
  65. if (dep[cx[i]]+dep[cy[i]]-dep[lca[i]]*2 > x) {
  66. ff[cx[i]]++; ff[cy[i]]++; ff[lca[i]] -= 2;
  67. cnt++;
  68. len = max(dep[cx[i]]+dep[cy[i]]-dep[lca[i]]*2, len);
  69. }
  70. MAX = 0;
  71. dfs(1, 0);
  72. if (len - MAX <= x) return 1;
  73. return 0;
  74. }
  75. int main() {
  76. int n = gi(), js = 0; m = gi();
  77. for (RG int i = 1; i < n; i++) {
  78. int u = gi(), v = gi(), w = gi();
  79. add(u, v, w); add(v, u, w);
  80. js += w;
  81. }
  82. for (RG int i = 1; i <= n; i++) fa[i] = i;
  83. for (RG int i = 1; i <= m; i++) {
  84. cx[i] = gi(), cy[i] = gi();
  85. q[cx[i]].push_back((zz){cy[i], i});
  86. q[cy[i]].push_back((zz){cx[i], i});
  87. }
  88. tarjan(1, 0);
  89. int l = 0, r = js, ans = js;
  90. while (l <= r) {
  91. int mid = (l + r) >> 1;
  92. if (check(mid))
  93. r = mid-1, ans = mid;
  94. else l = mid+1;
  95. }
  96. printf("%d\n", ans);
  97. return 0;
  98. }

洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)的更多相关文章

  1. 【数据结构】运输计划 NOIP2015提高组D2T3

    [数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...

  2. 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)

    P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...

  3. 洛谷-神奇的幻方-NOIP2015提高组复赛

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  4. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  5. [NOIP2015] 提高组 洛谷P2680 运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...

  6. 洛谷P2680 运输计划 [LCA,树上差分,二分答案]

    题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...

  7. 洛谷 P2680 运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...

  8. 洛谷——P2680 运输计划

    https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...

  9. 洛谷P2680 运输计划——树上差分

    题目:https://www.luogu.org/problemnew/show/P2680 久违地1A了好高兴啊! 首先,要最大值最小,很容易想到二分: 判断当前的 mid 是否可行,需要看看有没有 ...

随机推荐

  1. opennebula 创建镜像数据块

    {","csrftoken":"f5454a02dea7b4a7d5d50b482a762b57"}

  2. loj2512 [BJOI2018]链上二次求和

    传送门 分析 咕咕咕 代码 #include<iostream> #include<cstdio> #include<cstring> #include<st ...

  3. 数据库 MySQL 之 基本概念

    数据库 MySQL 之 基本概念 浏览目录 概述 数据库的特点 数据库的分类 选择MySQL的理由 & MariaDB 介绍 下载及安装 SQL介绍 一.概述 1.数据(data) 存储在表中 ...

  4. Row_Number() OVER()函数使用举例

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW ...

  5. MVC全局用户验证之HttpModule

    在请求进入到MVC的处理mcvHandler之前,请求先到达HttpModule,因此可以利用HttpModule做全局的用户验证. HttpModule MVC5之前的版本基于system.web. ...

  6. 《PRC:更新项目汇总额》报错

    请求报红,日志如下: +---------------------------------------------------------------------------+ 项目: Version ...

  7. 挂载ISO 和 KILL 掉占用进程

    mount -t iso9660 -o loop,user VMware-tools-linux-8.6.0-425873.iso /mnt/cdrom fuser -m -v -i -k  /mnt ...

  8. postfix 安装配置详解

    [ref: http://blog.51yip.com/server/1382.html] [http://blog.chinaunix.net/uid-174325-id-1744019.html] ...

  9. mysql数据库学习小结

    数据库的学习可以从以下几个层次了解掌握,这样思路清晰后后面不管怎么变化都可以随时应变: 1.mysql基础知识 2.操作数据库的方法,增 删 改 查 3.jdbc连接数据库,工作原理 难点重点,如:P ...

  10. 什么是“光照度(Illuminance)”?

    光照度是光度学的概念,了解光照度,要从人眼的特性说起. 人眼的光谱响应 传统的辐射度学的概念(如“功率”,单位为“瓦”)可以客观描述“能量”,但当其用来描述“光照”时却是不合适的,原因在于:人眼对不同 ...