luogu P2680 运输计划 (二分答案+树上差分)
题目背景
公元 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 的物流公司完成阶段性工作所需要的最短时间。
输入输出样例
6 3 1 2 3 1 6 4 3 1 7 4 3 6 3 5 5 3 6 2 5 4 5
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 运输计划 (二分答案+树上差分)相关推荐
- 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)
[题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...
- P2680 运输计划(树上差分+lca+二分)
题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...
- 洛谷P2680:运输计划(倍增、二分、树上差分)
传送门 文章目录 题目描述 解析 问题 代码 题目描述 解析 求最大值的最小值 容易想到二分 然后...就没有然后了... 看了题解 学会了一个新技能:树上差分 (其实学长之前好像讲过...) 一般的 ...
- P2680-运输计划【LCA,树上差分,二分答案】
正题 题目链接:https://www.luogu.org/problemnew/show/P2680 题目大意 一棵带权无根树,给出若干条路径.选择一条边使其边权变为0,要求路径的长度的最大值最小. ...
- P2680 运输计划
传送门 十分显然完成工作的时间和航耗时最长的运输计划有关 所以题目意思就是要求最大值最小 所以可以想到二分 把所有大于mid时间的航线打上标记,显然删边只能在所有这些航线的公共路径上 要如何快速打标记 ...
- [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- cogs2109 [NOIP2015] 运输计划
cogs2109 [NOIP2015] 运输计划 二分答案+树上差分. STO链剖巨佬们我不会(太虚伪了吧 首先二分一个答案,下界为0,上界为max{路径长度}. 然后判断一个答案是否可行,这里用到树 ...
- 差分数组 and 树上差分
差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
最新文章
- alter添加多个字段_Oracle中 create , alter , delete ,等关键字的使用
- 优点和阵列的缺点,并且一个链表
- EntityManager:seam新手必读(二)
- Multi-thread--C++11多线程中std::call_once的使用
- lbp特征提取算法 知乎_图像-LBP特征描述算子-人脸检测
- 程序员开发软件的意义到底在哪?
- 双十一虽过,李宁老师视频课程优惠仍将继续
- java打字训练课程设计_Java打字训练课程设计
- 科学网—语音识别技术发展史
- C++常用基础函数整理
- CUDA memory
- 简单力场护盾效果ASE实现笔记
- 【数据库】一篇文章搞掂:Oracle数据库
- 非计算机管理员用户 不可以,电脑非管理员账户要怎么办
- 高薪!OPPO研究院招高级算法工程师、专家(可直接内推)
- 初学pwn-攻防世界(get_shell)
- Java毕业设计-外卖点餐管理系统
- 武理校赛A题 ljw的剥削(思维 + map应用)
- 华为、微软、瑞幸、维达、奈飞、爱彼迎等公司高管变动
- python历史波动率_历史波动率计算问题?
热门文章
- 【动态规划区间dp】蓝桥2019:最优包含
- LIRe 源代码分析 4:建立索引(DocumentBuilder)[以颜色布局为例]
- 4个mos管驱动的全桥电路原理_逆变器工作原理
- HTML显示波形,CSS3波形loading动画特效
- 梦幻群侠传5帮派修炼_梦幻群侠传5唯美版
- 高岭土吸附阳离子_高岭石对金属阳离子的吸附特性研究
- android开发根据分辨率设置高度,【android】根据屏幕分辨率设置底栏高度
- Element-UI中el-input输入值不显示
- input做成label效果
- 【Python3】【爬虫】bilibili摄影板块