挺难的一道题,不过质量挺高的。
luoguP2680

看到最大值最小,首先想到的是二分。
可以预处理出每个点到根节点的距离dis数组,然后求每条路径的lca和两点的距离,即dis[u]+dis[v]-2*dis[lca(u,v)]
我之前使用的是树剖LCA但是T了好多点QAQ,改了倍增就不会了。
然后使用一个比较基础(?)的算法——树上差分,用来判断mid是否是可行解。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int N=300005;
int n,m,tot,mlen,num,tem,ans;
int head[N],ver[2*N],nxt[2*N],w[2*N];
int t[N],dis[N],f[N][27],a[N],dep[N];struct path
{int u,v,len,lc;
} p[N];inline int get()
{int res=0;char c=getchar();while (c<'0'||c>'9') c=getchar();while (c>='0'&&c<='9'){res=res*10+c-'0';c=getchar();}return res;
}inline void add(int x,int y,int z)
{ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;w[tot]=z;
}void dfs(int u,int fa)
{dep[u]=dep[fa]+1;for(int i=0;i<=24;i++)f[u][i+1]=f[f[u][i]][i];for(int e=head[u];e;e=nxt[e]){int v=ver[e];if(v==fa) continue;f[v][0]=u;a[v]=w[e];dis[v]=dis[u]+w[e];dfs(v,u);}
}inline int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);for(int i=24;i>=0;i--){if(dep[f[x][i]]>=dep[y]) x=f[x][i];if(x==y) return x;}for(int i=24;i>=0;i--){if(f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}void dfs3(int u,int f)
{for (int e = head[u]; e ; e = nxt[e]){int v=ver[e];if(v==f) continue;dfs3(v,u);t[u]+=t[v];}if(t[u]==num&&a[u]>tem) tem=a[u];
}inline bool check(int x)
{memset(t,0,sizeof(t));num=tem=0;for (int i = 1; i <= m; i++)if (p[i].len>x){t[p[i].u]++;t[p[i].v]++;t[p[i].lc]-=2;num++;}dfs3(1,0);if(mlen-tem>x) return false;return true;
}int main()
{int x,y,z;n=get(),m=get();for (int i = 1; i < n; i++){x=get(),y=get(),z=get();add(x,y,z),add(y,x,z);}dfs(1,0);for (int i = 1; i <= m ; i++){p[i].u=get(),p[i].v=get();p[i].lc=lca(p[i].u,p[i].v);p[i].len=dis[p[i].u]+dis[p[i].v]-2*dis[p[i].lc];}for (int i = 1; i <= m; i++)mlen=max(mlen,p[i].len);int l=0,r=mlen,mid;while (l<r){mid=(l+r)>>1;if (check(mid)) r=mid;else l=mid+1;}printf("%d",l);return 0;
}

转载于:https://www.cnblogs.com/zxj-hans/p/11266941.html

【题解】luoguP2680运输计划相关推荐

  1. LuoguP2680 运输计划

    题目地址 题目链接 题解 二分答案,那么大于答案的路径都需要有一条公共边,maxlen-val>=二分出来的x.val是边权. 考虑树剖,对每条大于答案的路径都+1(线段树里),枚举边,如果(线 ...

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

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

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

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

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

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

  5. P2680 运输计划

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

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

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

  7. cogs2109 [NOIP2015] 运输计划

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

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

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

  9. [luogu2680] 运输计划 (lca+二分+树上差分)

    传送门 Description Input Output 一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间. Sample Input 6 3 1 2 3 1 6 4 3 1 7 4 3 ...

最新文章

  1. 密钥生成并配置_基于密钥的SSH认证流程
  2. windows10 64位 Tensorflow安装--CUDA 9.1+cuDNN7.1.1+python3.6.4+tf1.6+vs2017
  3. Linux下制作动图的软件,Linux 下制作Gif动画
  4. [hiho1159] Poker
  5. 门户网站负载均衡技术的六大新挑战
  6. 【专题】多角度深入解析开放原子开源基金会
  7. P4198 楼房重建 线段树 + 区间合并
  8. UNIX(多线程):26---悲观锁和乐观锁
  9. java事务代码_关于java中实现JDBC事务控制代码示例
  10. python 浏览器自动化 弹窗控制_selenium 网页自动化 - 在访问一个网页时弹出的浏览器窗口,我该如何处理?...
  11. Hive 窗口函数lead、lag
  12. OMS智能订单管理系统
  13. 黑客为什么不攻击网贷平台?
  14. win10开机出现任务栏卡死无反应,桌面点击正常,重启任务管理器无效
  15. 利用神经网络预测股票价格走势
  16. 文件服务器属于固定资产吗,云服务器属于固定资产吗
  17. 16款设计师必知晓的思维导图工具
  18. iOS 获取手机步数
  19. 谷歌SEO之中小企业网站结构化数据实施的战略价值
  20. 质量管理、质量保证、质量控制的区别

热门文章

  1. OpenShift 4 之Service Mesh教程(3)- 访问流量管理
  2. OpenShift 4 之集群是如何通过Cluster Version Operator升级的?
  3. Elasticseach 从零开始学习记录(一) - 单实例环境搭建
  4. (六)构建MLOps模型API
  5. Python 2 退休
  6. Ionic 框架宣布 2019 年将正式支持 Vue 和 React
  7. 使用Visual Studio 2017创建React项目
  8. python重命名csv文件_Python根据文件中选定的字符复制和重命名许多小csv文件
  9. eslint是什么_为什么eslint没有 no-magic-string?
  10. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)