题意:

给你一棵n个结点的树,有m个运输计划,每个计划表示从一个点x到一个点y的路径长度,你可以将一条边的长度赋为0,问完成所有计划的最短时间。

题解:

再写一遍了;

要你扣掉一条边,直接扣掉再计算答案至少要\(O(nm)\)的复杂度,再加上这题常数比较大,最多50分吧;

那么二分答案转化问题,二分完成所有任务的时间,若扣掉一条边后用时最长的任务的时间小于mid,则返回true;

对于那些大于mid的任务,考虑扣掉一条边,应为我们二分了完成所有任务的时间,所以扣掉的这条边一定是要被所有的任务路径经过,并且越大越好,于是就要用到树上差分找到这条边,一遍dfs即可;

复杂度\(O((n+m)log1000)\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define N 300010
using namespace std;int n,m,L,e_num,mx,mw,num,ans=1<<30;
int nxt[N<<1],to[N<<1],w[N<<1],h[N];
int fa[N],dep[N],top[N],siz[N],son[N],dist[N],cnt[N];struct Node {int x,y,z;}task[N];inline int gi() {int x=0,o=1; char ch=getchar();while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') o=-1,ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return o*x;
}inline void add(int x, int y, int z) {nxt[++e_num]=h[x],to[e_num]=y,w[e_num]=z,h[x]=e_num;
}inline void dfs1(int u) {siz[u]=1;for(int i=h[u]; i; i=nxt[i]) {int v=to[i];if(v==fa[u]) continue;fa[v]=u,dep[v]=dep[u]+1,dist[v]=dist[u]+w[i];dfs1(v);if(siz[v]>siz[son[u]]) son[u]=v;siz[u]+=siz[v];}
}inline void dfs2(int u) {if(son[u]) top[son[u]]=top[u],dfs2(son[u]);for(int i=h[u]; i; i=nxt[i]) {int v=to[i];if(v==fa[u] || v==son[u]) continue;top[v]=v,dfs2(v);}
}inline void dfs3(int u) {for(int i=h[u]; i; i=nxt[i]) {int v=to[i];if(v==fa[u]) continue;dfs3(v);if(cnt[v]==num) mw=max(mw,w[i]);cnt[u]+=cnt[v];}
}inline int lca(int x, int y) {while(top[x]!=top[y]) {if(dep[top[x]]>dep[top[y]]) x=fa[top[x]];else y=fa[top[y]];}if(dep[x]<dep[y]) return x;else return y;
}inline bool check(int mid) {mx=mw=num=0;for(int i=1; i<=n; i++) cnt[i]=0;for(int i=1; i<=m; i++) {if(task[i].z>mid) {cnt[task[i].x]++,cnt[task[i].y]++,cnt[lca(task[i].x,task[i].y)]-=2;mx=max(mx,task[i].z),num++;}}dfs3(1);return mx-mw<=mid;
}int main() {n=gi(),m=gi();for(int i=1; i<n; i++) {int x=gi(),y=gi(),z=gi();add(x,y,z),add(y,x,z);}fa[1]=1,dep[1]=1,top[1]=1;dfs1(1),dfs2(1);lca(4,5);for(int i=1; i<=m; i++) {int x=gi(),y=gi(),z=dist[x]+dist[y]-dist[lca(x,y)]*2;task[i]=(Node){x,y,z};L=max(L,z);}int r=L,l=r-1000,mid;while(l<=r) {mid=(l+r)>>1;if(check(mid)) ans=min(ans,mid),r=mid-1;else l=mid+1;}printf("%d", ans);return 0;
}

转载于:https://www.cnblogs.com/HLXZZ/p/7708363.html

[NOIP2015] 运输计划(第二弹)相关推荐

  1. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  2. cogs2109 [NOIP2015] 运输计划

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

  3. 洛谷 2680 (NOIp2015) 运输计划

    题目:https://www.luogu.org/problemnew/show/P2680 因为是最长的时间最短,所以二分! 离线LCA可以知道路径长度.每次只看超过二分值的路径. 原本的想法是遍历 ...

  4. XSSFWorkbook 设置单元格样式_CVA高校精英计划第二弹:执行最佳操作,做好设置准备...

    一. 什么是财务建模的12项最佳操作? 1.要有清晰的思路,明确创建模型的目的:建立清晰的建模思路,绘制模型的基本蓝图. 2.保持简单:遵守KISS(Keep It Simple,Stupid)原则, ...

  5. $Luogu2680/NOIp2015$ 运输计划

    传送门 $Sol$ 最暴力的做法就是枚举最长链上的边,然后再算一次所有的链长,更新$ans$. 这里要求最大的最小,容易想到二分答案.对于二分的值$mid$,扫一遍所有的链,若链长小于等于$mid$, ...

  6. 【图论】【LCA】NOIP2015运输计划

    分析: mmp出题人太垃圾了 尼玛树链剖分 O(Nlog2N) O ( N l o g 2 N ) O(Nlog^2N)的算法跑得飞快,用LCA严格 O(NlogN) O ( N l o g N ) ...

  7. 【Bzoj4326】运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1091  Solved: 696 [Submit][Stat ...

  8. [NOIP2015提高组]运输计划

    题目:BZOJ4326.洛谷P2680.Vijos P1983.UOJ#150.codevs4632.codevs5440. 题目大意:有一棵带权树,有一些运输计划,第i个运输计划从ai到bi,耗时为 ...

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

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

  10. 开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系

    小蚂蚁说: 数据.消息.微服务是蚂蚁金服自主研发的金融级分布式中间件 SOFA (Scalable Open Financial Architecture)的三大方向. 一个多月前,蚂蚁金服开源了 S ...

最新文章

  1. MIT自动驾驶船下水!可乘坐5人,阿姆斯特丹运河航行3小时误差不到0.17米
  2. phpsql拼接_SQL存储过程中SQL语句拼接
  3. mysql-安装教程
  4. 维信诺通过9.5亿元应收款保理业务提案
  5. jsp、css中引入外部资源相对路径的问题
  6. python课设带报告_20193103陈柏维《Python程序设计》实验四报告
  7. CDN与智能DNS原理和应用
  8. lodopa5预览时默认横向_微软Windows 10 20H1预览版18922开始推送,附更新内容
  9. Zynq7000硬件开发之硬件开发流程简介(一)
  10. elementui 下拉框回显_elementUI Cascader 级联选择器回显
  11. C#:using和new关键字
  12. GBase 8s分布式功能之异地容灾
  13. 双十一购买什么最划算,最值得入手的几款数码好物推荐
  14. 【Web前端】html+css+javascript
  15. 计算机中文核心期刊哪个快,计算机中文核心期刊要多久cpci加急,又快又水的sci期刊...
  16. CSS—— grid 网格布局
  17. java程序实现删除本地文件
  18. OOALV中字段设置ALV中下拉列表列的实现
  19. 批量读取和写出excel数据#R语言#
  20. r5处理器_Intel难受了,R54500U,6核心处理器笔记本价格才3499元

热门文章

  1. merge into用法mysql_Oracle MERGE INTO的用法示例介绍
  2. 下载faceScrub人脸数据库(单线程版本)
  3. python实现Kruskal算法求解加权图中最小生成树问题
  4. eclipse中html设置,无法在eclipse中设置HTMLUNIT
  5. mysql数据库root密码在哪个文件中_mysql数据库的root密码放在什么位置?
  6. springboot 优雅停机_Spring Boot 程序的优雅停机[译文]
  7. java循环第四次处理_JAVA第四次实验
  8. 冲突等价(ConflictEquivalence) 可串行化调度(Serializable Schedules)
  9. linux shell 将命令行终端输出结果写入保存到文件中
  10. 微信小程序云开发教程-云函数操作数据库-增、查