题目描述

公元$ 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\) 的物流公司完成阶段性工作所需要的最短时间是多少?

Input

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

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

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

数据保证 \(1≤u_i,v_i≤n,1<=n,m<=300000\)

数据保证 \(1≤a_i,b_i≤n\) 且 \(0≤t_i≤1000\)。

Output

输出 共\(1\)行,包含\(1\)个整数,表示小\(P\)的物流公司完成阶段性工作所需要的最短时间。

Sample Input

  1. 6 3
  2. 1 2 3
  3. 1 6 4
  4. 3 1 7
  5. 4 3 6
  6. 3 5 5
  7. 3 6
  8. 2 5
  9. 4 5

Sample Output

  1. 11

首先,看到了最大值最小就很自然的想到了二分答案。

嗯,二分是很显然的。。。。

那么,我们该如何\(check\)呢?,对于两点间路径已经小于当前\(x\)的路径可以直接忽视掉。

那么剩下来的路径就是大于当前\(x\)的路径了,对于这些路径我们需要去掉一条边是所有的路径中最大值最小。

即,我们需要减去路径交集中最大的边

这个操作是很显然的,因为只有减得越多才可以剩的越少。

现在,我们需要做的就是求出所有路径的交集了?

怎么求呢?我们可以利用树上差分来进行求解。

我们需要将边转换到点上,那么我们该如何转换呢?

由于一条边的节点一定是父亲节点和儿子节点之分。

而儿子节点所对应的边只有一条,所以我们将边转移到子节点上。

当加入一条路径\(a,b\)时,设\(LCA\)为\(a,b\)的\(lca\),则\(Sum[a]++,Sum[b]++,Sum[LCA]-=2\)。

我们统计答案时若当前节点的\(Sum\)值为不满足条件的路径个数,说明该节点所对应的边为所有路径的交集,

更新答案即可。。。

最后看一下最长的路径减去路径上的最大值是否\(<=\)当前\(x\)即可。

不过这道题的数据较大,普通的算法容易被卡掉。

那么,我们就需要一些优化。。。

1.优化二分上下界:

\(L=\)最长的路径长度减去最大的边权,\(R=\)最长的路径长度。

这样二分的次数保证在\(10\)以内。

2.避免递归:

由于统计答案时,我们需要递归求解,而递归是有常数的,

我们又发现一个节点的值只和其子树有关,而子树在\(dfs\)序中时保证子节点编号大于根节点编号。

于是,我们可以利用\(dfs\)序倒着更新\(Sum\)值。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. #define reg register
  5. #define Raed Read
  6. #define debug(x) cerr<<#x<<" = "<<x<<endl;
  7. #define rep(a,b,c) for(reg int a=(b),a##_end_=(c); a<=a##_end_; ++a)
  8. #define ret(a,b,c) for(reg int a=(b),a##_end_=(c); a<a##_end_; ++a)
  9. #define drep(a,b,c) for(reg int a=(b),a##_end_=(c); a>=a##_end_; --a)
  10. #define erep(i,G,x) for(int i=(G).Head[x]; i; i=(G).Nxt[i])
  11. inline char G1() {
  12. static const int LEN=2000005;
  13. static char U[LEN],*T=U,*E=U;
  14. if(T==E)T=U,E=U+fread(U,1,LEN,stdin);
  15. return T==E?EOF:*T++;
  16. }
  17. inline int Read(void) {
  18. int res=0,f=1;
  19. char c;
  20. while(c=G1(),c<48||c>57)if(c=='-')f=0;
  21. do res=(res<<3)+(res<<1)+(c^48);
  22. while(c=G1(),c>=48&&c<=57);
  23. return f?res:-res;
  24. }
  25. template<class T>inline bool Min(T &a,T const&b) {
  26. return a>b ?a=b,1:0;
  27. }
  28. template<class T>inline bool Max(T &a,T const&b) {
  29. return a<b?a=b,1:0;
  30. }
  31. const int N=3e5+5,M=3e5+5,mod=1e9+7;
  32. bool MOP1;
  33. int n,m,A[N],B[N],TT[M];
  34. struct Link_list {
  35. int Tot,Head[N],to[M<<1],Nxt[M<<1],cost[M<<1];
  36. inline void clear(void) {
  37. Tot=0;
  38. memset(Head,0,sizeof Head);
  39. }
  40. inline void AddEdgepair(int a,int b,int c) {
  41. to[++Tot]=b,cost[Tot]=c,Nxt[Tot]=Head[a],Head[a]=Tot;
  42. to[++Tot]=a,cost[Tot]=c,Nxt[Tot]=Head[b],Head[b]=Tot;
  43. }
  44. } G;
  45. int Fa[M],dep[M],top[M],sz[M],son[M],Dis[M],LCA[N],cnt,Id[N];
  46. void dfs1(int x,int f) {
  47. Id[++cnt]=x;
  48. dep[x]=dep[f]+1,Fa[x]=f,sz[x]=1;
  49. erep(i,G,x) {
  50. int y=G.to[i];
  51. if(y==f)continue;
  52. Dis[y]=Dis[x]+G.cost[i];
  53. TT[y]=G.cost[i];
  54. dfs1(y,x),sz[x]+=sz[y];
  55. if(sz[y]>sz[son[x]])son[x]=y;
  56. }
  57. }
  58. void dfs2(int x,int f) {
  59. top[x]=f;
  60. if(son[x])dfs2(son[x],f);
  61. else return;
  62. erep(i,G,x) {
  63. int y=G.to[i];
  64. if(y==Fa[x]||y==son[x])continue;
  65. dfs2(y,y);
  66. }
  67. }
  68. inline int lca(int x,int y) {
  69. while(top[x]!=top[y]) {
  70. if(dep[top[x]]>dep[top[y]])x=Fa[top[x]];
  71. else y=Fa[top[y]];
  72. }
  73. return dep[x]<dep[y]?x:y;
  74. }
  75. int res,tot,Sum[N];
  76. inline bool check(int x) {
  77. res=-1,tot=0;
  78. rep(i,1,n)Sum[i]=0;
  79. rep(i,1,m) {
  80. if(Dis[A[i]]+Dis[B[i]]-2*Dis[LCA[i]]<=x)continue;
  81. tot++,Sum[A[i]]++,Sum[B[i]]++,Sum[LCA[i]]-=2;
  82. }
  83. drep(i,n,1) {
  84. int u=Id[i];
  85. erep(i,G,u) {
  86. int y=G.to[i];
  87. if(y==Fa[u])continue;
  88. Sum[u]+=Sum[y];
  89. }
  90. if(Sum[u]==tot)Max(res,TT[u]);
  91. }
  92. if(res==-1)return false;
  93. rep(i,1,m) {
  94. if(Dis[A[i]]+Dis[B[i]]-2*Dis[LCA[i]]<=x)continue;
  95. if(Dis[A[i]]+Dis[B[i]]-2*Dis[LCA[i]]-res>x)return false;
  96. }
  97. return true;
  98. }
  99. int Ma;
  100. inline void solve(void) {
  101. int L=0,R=0,Ans=0;
  102. rep(i,1,m)Max(R,Dis[A[i]]+Dis[B[i]]-2*Dis[LCA[i]]);
  103. L=R-Ma;
  104. while(L<=R) {
  105. int mid=(L+R)>>1;
  106. if(check(mid))Ans=mid,R=mid-1;
  107. else L=mid+1;
  108. }
  109. printf("%d\n",Ans);
  110. }
  111. bool MOP2;
  112. inline void _main(void) {
  113. n=Read(),m=Read();
  114. int f=1;
  115. ret(i,1,n) {
  116. int a=Read(),b=Read(),c=Read();
  117. Max(Ma,c),G.AddEdgepair(a,b,c);
  118. }
  119. dfs1(1,0),dfs2(1,1);
  120. rep(i,1,m)A[i]=Read(),B[i]=Read(),LCA[i]=lca(A[i],B[i]);
  121. solve();
  122. }
  123. signed main() {
  124. _main();
  125. return 0;
  126. }

noip2015day2-运输计划的更多相关文章

  1. bzoj 4326: NOIP2015 运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个 ...

  2. noip2015 运输计划

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

  3. 【bzoj4326】[NOIP2015]运输计划

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

  4. [题解]vijos 运输计划

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

  5. NOIP2015 运输计划(bzoj4326)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 886  Solved: 574[Submit][Status] ...

  6. UOJ #150 【NOIP2015】 运输计划

    题目描述 公元 \(2044\) 年,人类进入了宇宙纪元. \(L\) 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个星球之间,这 \(n-1\) 条航道连通了 \(L ...

  7. [bzoj4326][NOIP2015]运输计划

    Description 公元2044年,人类进入了宇宙纪元. 国有个星球,还有条双向航道,每条航道建立在两个星球之间,这条航道连通了国的所有星球. 小掌管一家物流公司,该公司有很多个运输计划,每个运输 ...

  8. 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status] ...

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

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

  10. [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划

    [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划 试题描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− ...

随机推荐

  1. json的值键对,对象,数组,逻辑值

    详细说一下有关json的相关知识: ㈠json与xml的异同 ★与 XML 相同之处 ⑴JSON 是纯文本 ⑵JSON 具有"自我描述性"(人类可读) ⑶JSON 具有层级结构(值 ...

  2. STS热部署方法(springboot)

    sts热部署,即是在项目中修改代码不用重新启动服务,提高效率.   方法如下: 1.在pom文件中引入  devtools  依赖: <dependency> <groupId> ...

  3. 第五周学习总结&实验报告三

    第五周课程总结 1.this和super的区别: this:访问本类中的属性,如果本类没有此属性则从父类中继续查找:访问本类中的方法,如果本类中没有此方法则从父类中继续查找:调用本类构造,必须放在构造 ...

  4. java期末课程总结

    期末课程总结 转眼间,这个学期就要过去了,我们Java的学习也接近了尾声,回想到这个学期刚开始接触到Java的时候,感觉什么都不懂,但现在似乎有了门路,不会载懵懵懂懂, 虽然本学期面向对象与Java程 ...

  5. ajaxGird修改一条记录中的字段

    var rowData = ajaxgrid.getSelectedRow(); var quality = rowData["quality"]; var rowIndex = ...

  6. Vimdiff 使用

    what is vimdiff 在类nuix平台,我们希望对文件之间的差异之间快速定位,希望能够很容易的进行文件合并……. 可以使用Vim提供的diff模式,通常称作vimdiff,就是这样一个能满足 ...

  7. 11G 新特性之 密码延迟认证

    11G 新特性之 密码延迟认证 11G 新特性之 密码延迟认证 Table of Contents 1. 特性简述 2. 特性潜在引发问题 3. 关闭特性 1 特性简述 为了防止用户密码的暴力破解,从 ...

  8. 使用conda安装命令时一直出现问题,因为从2019年4月添加的国内镜像都不能用了

    安装过程中出现以下问题:(历尽千辛万苦,终于才查到原来是清华源,腾讯源都不能用了)The remote server could not find the noarch directory for t ...

  9. UML学习笔记_01_基本概念

    1.什么是UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发 ...

  10. 阶段3 2.Spring_02.程序间耦合_1 编写jdbc的工程代码用于分析程序的耦合

    创建新项目.不选择骨架 打包方式选择是jar 增加mysql的包依赖 创建demo类来讲解程序的耦合 原来里面提供了sql语句.拿到mysql没执行