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 条双向航道,每 ...
随机推荐
- maven手动添加jar包到本地仓库
推荐几个好的 Maven 常用仓库网址:http://mvnrepository.com/http://search.maven.org/ Maven 安装 JAR 包的命令是: mvn instal ...
- mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
- linux python3 selenuim firefox
1.官网下载火狐浏览器最新版本复制到/usr/local/softwar 下 cd /usr/local/softwar 下 tar jxvf Firefox-latest-x86_64.tar.bz ...
- 认真学习Linux系统让你真的有收获
学习,最重要的是有一个认真的态度,熟话说,读书可以改变命运,以前觉得并不一定是这样,其实经历的多了才知道,事实确实如此.试想一个不会写字看书的人,他的生活该有多么无聊.读书容易,但读好书并不总是件容易 ...
- Ubuntu16.04 ERROR 1698 (28000): Access denied for user 'root'@'localhost' 解决流程
mysql版本 5.7.22 安装完成后出现问题 ERROR 1698 (28000): Access denied for user 'root'@'localhost' 可能是因为初始密码为空:按 ...
- python 模块之-re
就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹 ...
- BZOJ3585&3339mex——主席树
题目描述 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入 第一行n,m.第二行为n个数.从第三行开始,每行一个询问l,r. 输出 一行一个 ...
- 学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator
前言 主要是完成微服务的监控,完成监控治理.可以查看微服务间的数据处理和调用,当它们之间出现了异常,就可以快速定位到出现问题的地方. springboot - version: 2.0 正文 依赖 m ...
- 学习Spring Boot:(二十)使用 MongoDB
前言 MongoDB 1 是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.Mongo ...
- [luogu2522][bzoj2301][HAOI2011]Problem b【莫比乌斯反演】
传送门:https://www.luogu.org/problemnew/show/P2522 题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y ...