题目背景

公元 20442044 年,人类进入了宇宙纪元。

题目描述

公元20442044 年,人类进入了宇宙纪元。

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

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

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

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

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

输入输出格式

输入格式:

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

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

接下来 mm 行描述运输计划的情况,其中第 jj 行包含两个正整数 u_juj​ 和 v_jvj​,表示第 jj 个运输计划是从 u_juj​ 号星球飞往 v_jvj​号星球。数据保证 1 \leq u_i,v_i \leq n1≤ui​,vi​≤n

输出格式:

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

输入输出样例

输入样例#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

说明

所有测试数据的范围和特点如下表所示

请注意常数因子带来的程序效率上的影响。

思路:

很明显答案是递增的,我们可以直接二分答案,设最短时间为t,那么航线时间大于t的我们就把他放到差分数组里,然后在差分数组里找到所有链公有的权值最大的边权,看减去这条边后所有航线是否都小于等于之前假设的最短时间t,.

这道题注意要用读入挂,要不一直TLE第13个样例。。。。

实现代码:

#include<bits/stdc++.h>
using namespace std;const int M = 3e5 + 10;
int p[M][22],w[M],dep[M],cnt,head[M],n,ans,dist[M],num,mx,m,sum[M];
int len[M],u[M],v[M],lc[M],r,l;
struct node{int to,next,w;
}e[M<<1];void Add(int u,int v,int w){e[++cnt].to = v;e[cnt].next = head[u];e[cnt].w = w,head[u] = cnt;
}void dfs(int u,int fa,int deep){dep[u] = deep;p[u][0] = fa;for(int i = head[u];i;i=e[i].next){int v = e[i].to;if(v == fa) continue;dist[v] = dist[u] + e[i].w;w[v] = e[i].w;dfs(v,u,deep+1);}
}void get_fa(){for(int j = 1;(1<<j)<=n;j++)for(int i = 1;i <= n;i ++)p[i][j] = p[p[i][j-1]][j-1];
}int lca(int a,int b){if(dep[a] > dep[b]) swap(a,b);int h = dep[b] - dep[a];for(int i = 0;(1<<i)<=h;i++){if((1<<i)&h) b = p[b][i];}if(a != b){for(int i = 20;i >= 0;i --){if(p[a][i] != p[b][i]){a = p[a][i]; b = p[b][i];}}a = p[a][0];}return a;
}void dfs1(int u,int fa){for(int i = head[u];i;i=e[i].next){int v = e[i].to;if(v == fa) continue;dfs1(v,u);sum[u] += sum[v];}if(sum[u] == num) mx = max(mx,w[u]);
}bool check(int x){int k = 0;num = 0; mx = 0;memset(sum,0,sizeof(sum));for(int i = 1;i <= m;i ++){if(len[i] > x){sum[u[i]]++; sum[v[i]]++;sum[lc[i]] -= 2;num++;k = max(k,len[i]);}}dfs1(1,0);if(k - x <= mx) return 1;else return 0;
}int read(){char c;int num,f=1;while(c=getchar(),!isdigit(c))if(c=='-')f=-1;num=c-'0';while(c=getchar(), isdigit(c))num=num*10+c-'0';return f*num;
}inline bool read(int &num)
{char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;
}int main()
{int a,b,c;read(n); read(m);for(int i = 1;i < n;i ++){read(a);read(b);read(c);Add(a,b,c); Add(b,a,c);}dfs(1,0,1); get_fa();for(int i = 1;i <= m;i ++){read(u[i]); read(v[i]);lc[i] = lca(u[i],v[i]);len[i] = dist[u[i]] + dist[v[i]] - 2*dist[lc[i]];r = max(r,len[i]);}int k = 0;while(l <= r){int mid = (l + r) >> 1;if(check(mid)){k = mid;r = mid-1;}else l = mid+1;}printf("%d\n",k);
}

转载于:https://www.cnblogs.com/kls123/p/9992216.html

luogu P2680 运输计划 (二分答案+树上差分)相关推荐

  1. 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)

    [题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...

  2. P2680 运输计划(树上差分+lca+二分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  3. 洛谷P2680:运输计划(倍增、二分、树上差分)

    传送门 文章目录 题目描述 解析 问题 代码 题目描述 解析 求最大值的最小值 容易想到二分 然后...就没有然后了... 看了题解 学会了一个新技能:树上差分 (其实学长之前好像讲过...) 一般的 ...

  4. P2680-运输计划【LCA,树上差分,二分答案】

    正题 题目链接:https://www.luogu.org/problemnew/show/P2680 题目大意 一棵带权无根树,给出若干条路径.选择一条边使其边权变为0,要求路径的长度的最大值最小. ...

  5. P2680 运输计划

    传送门 十分显然完成工作的时间和航耗时最长的运输计划有关 所以题目意思就是要求最大值最小 所以可以想到二分 把所有大于mid时间的航线打上标记,显然删边只能在所有这些航线的公共路径上 要如何快速打标记 ...

  6. [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

  7. cogs2109 [NOIP2015] 运输计划

    cogs2109 [NOIP2015] 运输计划 二分答案+树上差分. STO链剖巨佬们我不会(太虚伪了吧 首先二分一个答案,下界为0,上界为max{路径长度}. 然后判断一个答案是否可行,这里用到树 ...

  8. 差分数组 and 树上差分

    差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...

  9. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

最新文章

  1. alter添加多个字段_Oracle中 create , alter , delete ,等关键字的使用
  2. 优点和阵列的缺点,并且一个链表
  3. EntityManager:seam新手必读(二)
  4. Multi-thread--C++11多线程中std::call_once的使用
  5. lbp特征提取算法 知乎_图像-LBP特征描述算子-人脸检测
  6. 程序员开发软件的意义到底在哪?
  7. 双十一虽过,李宁老师视频课程优惠仍将继续
  8. java打字训练课程设计_Java打字训练课程设计
  9. 科学网—语音识别技术发展史
  10. C++常用基础函数整理
  11. CUDA memory
  12. 简单力场护盾效果ASE实现笔记
  13. 【数据库】一篇文章搞掂:Oracle数据库
  14. 非计算机管理员用户 不可以,电脑非管理员账户要怎么办
  15. 高薪!OPPO研究院招高级算法工程师、专家(可直接内推)
  16. 初学pwn-攻防世界(get_shell)
  17. Java毕业设计-外卖点餐管理系统
  18. 武理校赛A题 ljw的剥削(思维 + map应用)
  19. 华为、微软、瑞幸、维达、奈飞、爱彼迎等公司高管变动
  20. python历史波动率_历史波动率计算问题?

热门文章

  1. 【动态规划区间dp】蓝桥2019:最优包含
  2. LIRe 源代码分析 4:建立索引(DocumentBuilder)[以颜色布局为例]
  3. 4个mos管驱动的全桥电路原理_逆变器工作原理
  4. HTML显示波形,CSS3波形loading动画特效
  5. 梦幻群侠传5帮派修炼_梦幻群侠传5唯美版
  6. 高岭土吸附阳离子_高岭石对金属阳离子的吸附特性研究
  7. android开发根据分辨率设置高度,【android】根据屏幕分辨率设置底栏高度
  8. Element-UI中el-input输入值不显示
  9. input做成label效果
  10. 【Python3】【爬虫】bilibili摄影板块