洛谷P2680运输计划
传送门啦
要求的就是,把树上的一条边的权值设为0之后,所有路径中的最大值的最小值。
首先二分最大值,假设某次二分的最大值为x,我们首先找出所有大于x的路径(也就是我们需要通过改权缩短的路径),并把路径上的所有边都标记一下。
在标记完成后,枚举所有边,如果存在一条边位于所有长度大于于x的路径上,并且删除之后能使所有路径都满足 $ length<=x $ ,则返回 $ true $ ,否则 $ false $ 。
还有一个问题就是,对于某个路径,如何快速标记出他经过的所有边呢?我们可以使用差分,用树上前缀和来表示某个点被标记次数。比如某条边 $ E(u,v) $ ,先把 $ sum[u]+=1,sum[v]+=1 $ ,然后 $ sum[lca(u,v)]-=2 $
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define re register
using namespace std;
const int maxn = 300005;
inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0'){if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
return x * f;
}
int n,m,a,b,t,u[maxn],v[maxn];
int head[maxn],tot;
int f[maxn][21],ans;
struct Edge{
int from,to,val,next;
}edge[maxn << 1];
inline void add(int u , int v , int w){
edge[++tot].from = u;
edge[tot].to = v;
edge[tot].val = w;
edge[tot].next = head[u];
head[u] = tot;
}
int dep[maxn],dis[maxn],value[maxn],len[maxn];
int id[maxn],cnt;
inline void dfs(int x , int fa) {
id[++cnt] = x;
dep[x] = dep[fa] + 1;
f[x][0] = fa;
for(re int i = 1 ; (1 << i ) <= dep[x] ; ++i)
f[x][i] = f[f[x][i - 1]][i - 1];
for(re int i = head[x] ; i ; i = edge[i].next) {
int v = edge[i].to;
if(v == fa) continue;
dis[v] = dis[x] + edge[i].val;
value[v] = edge[i].val;
dfs(v , x);
}
}
inline int lca(int u , int v){
if(dep[u] < dep[v]) swap(u , v);
for(re int i = 18 ; i >= 0 ; --i)
if((1 << i) <= (dep[u] - dep[v]))
u = f[u][i];
if(u == v) return u;
for(re int i = 18 ; i >= 0 ; --i){
if((1 << i) <= dep[u] && f[u][i] != f[v][i]) {
u = f[u][i] ;
v = f[v][i] ;
}
}
return f[u][0];
}
int sum[maxn];
inline bool check(int k){
for(re int i = 1 ; i <= n ; ++i)
sum[i] = 0;
int maxx = 0 , cnt = 0 ;
for(re int i = 1 ; i <= m ; ++i) {
if(len[i] > k) {
maxx = max(maxx , len[i]) ;
cnt++;
sum[u[i]]++; sum[v[i]]++;
sum[lca(u[i] , v[i])] -= 2;
}
}
for(re int i = n ; i >= 0 ; i--)
sum[f[id[i]][0]] += sum[id[i]] ;
for(re int i = 1 ; i <= n ; ++i)
if(sum[i] >= cnt && maxx - value[i] <= k)
return true;
return false;
}
int main(){
n = read() ; m = read();
for(re int i = 1 ; i <= n - 1 ; ++i){
a = read(); b = read(); t = read();
add(a , b , t);
add(b , a , t);
}
dfs(1 , 0);
int l = 0 , r = 0 ;
for(re int i = 1 ; i <= m ; ++i){
u[i] = read(); v[i] = read();
len[i] = dis[u[i]] + dis[v[i]] - 2 * dis[lca(u[i] , v[i])] ;
r = max(r , len[i]);
}
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) {
ans = mid;
r = mid - 1 ;
}
else l = mid + 1;
}
printf("%d\n",ans);
return 0;
}
洛谷P2680运输计划的更多相关文章
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...
- 洛谷 P2680 运输计划 解题报告
P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...
- [NOIP2015] 提高组 洛谷P2680 运输计划
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
- 洛谷P2680 运输计划 [LCA,树上差分,二分答案]
题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...
- 洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)
题目背景 公元 \(2044\) 年,人类进入了宇宙纪元. 题目描述 公元\(2044\) 年,人类进入了宇宙纪元. L 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个 ...
- 洛谷 P2680 运输计划
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
- 洛谷——P2680 运输计划
https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...
- 洛谷P2680 运输计划——树上差分
题目:https://www.luogu.org/problemnew/show/P2680 久违地1A了好高兴啊! 首先,要最大值最小,很容易想到二分: 判断当前的 mid 是否可行,需要看看有没有 ...
- 洛谷P2680 运输计划
大概就是二分+树上差分... 题意:给你树上m条路径,你要把一条边权变为0,使最长的路径最短. 最大的最小,看出二分(事实上我并没有看出来...) 然后二分k,对于所有大于k的边,树上差分求出最长公共 ...
随机推荐
- 21天实战caffe笔记_第一天
1 深度学习术语 深度学习常用名词:有监督学习.无监督学习.训练数据集.测试数据集.过拟合.泛化.惩罚值(损失loss); 机器自动学习所需三份数据:训练集(机器学习的样例),验证集(机器学习阶段,用 ...
- Error: cannot allocate vector of size 88.1 Mb问题
这几天训练模型运行代码的时候,老是提示我说:Error: cannot allocate vector of size 88.1 Mb,只知道分配空间不足. 下面是查资料看到的一些回答: 一.这个是R ...
- ACF/PACF,残差白噪声的检验问题
关于自相关.偏自相关: 一.自协方差和自相关系数 p阶自回归AR(p) 自协方差 r(t,s)=E[X(t)-EX(t)][X(s)-EX(s)] 自相关系数ACF ...
- Go_15:GoLang中面向对象的三大特性
有过 JAVA 语言学习经历的朋友都知道,面向对象主要包括了三个基本特征:封装.继承和多态.封装,就是指运行的数据和函数绑定在一起,JAVA 中主要是通过 super 指针来完成的:继承,就是指 cl ...
- (转) linux下vim和bash配置文件
1.注释版 ~/.vimrc "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 set nocompatible set autoread " 文件修改之后自动载入 ...
- Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
- Linux 常见文件及目录
文件/etc//etc/passwd用户基本信息/etc/group用户组基本信息/etc/shadow/etc/passwd 文件的补充/etc/gshadow阴影口令套组中的组配置文件/etc/l ...
- dp px 互转工具类
public class DensityUtils { public static int dpToPx(Context context,int dp){ float density = contex ...
- The Difference Between Big Data and a Lot of Data
The Difference Between Big Data and a Lot of Data The term “big data” has been around for a while no ...
- Overfitting & Regularization
Overfitting & Regularization The Problem of overfitting A common issue in machine learning or ma ...