luogu P2680 运输计划
要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足.
二分最终答案.我们要使得原来长度大于二分的\(mid\)的链删边后小于\(mid\),所以要找出一条最长的,被所有长度大于\(mid\)的链包含的边,使得最长链长度减去这条边长度不超过\(mid\)
用树剖求出\(lca\),用来求每条链的长度.我们还要在check的时候知道每条边被哪些长度大于\(mid\)的链覆盖,使用差分即可
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=300000+10;
il LL rd()
{
re LL x=0,w=1;re char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N<<2],nt[N<<2],w[N<<2],hd[N],tot=1;
il void add(int x,int y,int z)
{
++tot;to[tot]=y;nt[tot]=hd[x];w[tot]=z;hd[x]=tot;
++tot;to[tot]=x;nt[tot]=hd[y];w[tot]=z;hd[y]=tot;
}
int n,sz[N],de[N],hc[N],top[N],dis[N],fae[N],fa[N],a[N],m,q[N][3],len[N],maxl,ma,nm;
il void dfs1(int x,int ffa)
{
sz[x]=1;
for(re int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
dis[y]=dis[x]+w[i],de[y]=de[x]+1,fae[y]=w[i],fa[y]=x;
dfs1(y,x);
sz[x]+=sz[y];
if(sz[y]>sz[hc[x]]) hc[x]=y;
}
}
il void dfs2(int x,int ffa)
{
if(hc[x])
{
top[hc[x]]=top[x];
dfs2(hc[x],x);
}
for(re int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa||y==hc[x]) continue;
top[y]=y;
dfs2(y,x);
}
}
il void dd(int x,int ffa)
{
for(re int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
dd(y,x);
a[x]+=a[y];
if(a[y]>=nm) ma=max(ma,fae[y]);
}
}
il bool check(int mid)
{
ma=nm=0;
for(re int i=1;i<=n;i++) a[i]=0;
for(re int i=1;i<=m;i++)
if(len[i]>mid) ++a[q[i][0]],++a[q[i][1]],----a[q[i][2]],++nm;
dd(1,0);
return mid>=maxl-ma;
}
int main()
{
n=rd(),m=rd();
for(re int i=1;i<n;i++)
{
int x=rd(),y=rd(),z=rd();
add(x,y,z);
}
de[1]=1,dfs1(1,0),top[1]=1,dfs2(1,0);
for(re int i=1;i<=m;i++)
{
int x=q[i][0]=rd(),y=q[i][1]=rd();
while(top[x]!=top[y])
{
if(de[top[x]]<de[top[y]]) swap(x,y);
len[i]+=dis[x]-dis[top[x]]+fae[top[x]];
x=fa[top[x]];
}
if(de[x]<de[y]) swap(x,y);
len[i]+=dis[x]-dis[y];
q[i][2]=y;
maxl=max(maxl,len[i]);
}
int l=0,r=maxl,mid,ans=maxl;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}
luogu P2680 运输计划的更多相关文章
- Luogu P2680 运输计划(二分+树上差分)
P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...
- [luogu]P2680 运输计划[二分答案][树上差分]
[luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...
- luogu P2680 运输计划 (二分答案+树上差分)
题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...
- luogu P2680 运输计划 65分做法
临近\(noip,AK\)不太现实,暴力才是王道,大佬无视 这里只介绍\(65\)分做法 ① \(m==1\) 的情况 很明显 就一条路径,当然要贪心选着一条路径路上的最大的边喽 傻逼分\(get 2 ...
- 洛谷 P2680 运输计划 解题报告
P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...
- P2680 运输计划(二分+树上差分)
P2680 运输计划 链接 分析: 二分+树上差分. 首先可以二分一个答案,那么所有比这个答案大的路径,都需要减去些东西才可以满足这个答案. 那么减去的这条边一定在所有的路径的交集上. 那么如果求快速 ...
- P2680 运输计划
http://www.luogu.org/problem/show?pid=2680#sub 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航 ...
- 洛谷——P2680 运输计划
https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...
随机推荐
- Delphi中的Sender:TObject对象解析
Delphi中的Sender:TObject对象解析 procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过 ...
- python之attrgetter函数对对象排序
# 使用attrgetter函数对对象排序 # attrgetter处理对象,itemgetter处理序列 from operator import attrgetter class user(): ...
- 洛谷P3588 [POI2015]PUS
题面 sol:说了是线段树优化建图的模板... 就是把一整个区间的点连到一个点上,然后用那个点来连需要连一整个区间的点就可以了,就把边的条数优化成n*log(n)了 #include <queu ...
- python成长之路七-函数的进阶
1,python中,名称空间分三种: 全局命名空间 局部命名空间(临时命名空间) 内置名称空间 2,作用域(两种): 1,全局作用域 包含:全局名称空间 内置名称空间 2,局部作用域 包含:局 ...
- HDU1069 最长上升子序列
emm....矩形嵌套 还记得吗....就是它... 直接贴代码了.... import java.util.ArrayList; import java.util.Arrays; import ja ...
- Inside JVM 内存模型
Inside JVM 内存模型 来源 原文:https://blog.csdn.net/silentbalanceyh/article/details/4661230 参考:IBM开发中心文档,&l ...
- 【比赛】NOIP2018 总结
一.考试过程 Day1: 先看了一遍题目,得到的结论是没有题是直接秒掉的,然后一道一道认真看. 看T1的时候开始并没想起来有一道原题,只是脑海中有一个印象,好像求差分和可以.然后自测了一下小样例,发现 ...
- 【刷题】AtCoder Regular Contest 003
A.GPA計算 题意:\(n\) 个人,一个字符串表示每个人的等第,每种等第对应一种分数.问平均分 做法:算 #include<bits/stdc++.h> #define ui unsi ...
- android studio+grade配置构建
Android 构建系统编译应用资源和源代码,然后将它们打包成可供您测试.部署.签署和分发的 APK.android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程,同 ...
- 述 SQL 中的 distinct 和 row_number() over() 的区别及用法
1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...