我们先不会就二分一下答案,设它是x,我们要判断它能不能满足

为了满足这个答案,我们就要让原本路径长度大于x的所有路径都经过某条边,而且这条边还要大于等于最长的路径-x

于是运用树上差分的思想,对于所有长度>x的路径,给他的两端点处++,lca处--,这样统计树上每个点的子树的和,就是这个点与它父节点连边被经过的次数

拿被经过次数>=长度大于x的路径条数的边 取一取最大值 然后判一判就行了

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=3e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int b,l,ne;
}eg[maxn*],que[maxn*];
int N,M;
int egh[maxn],ect,qh[maxn],lca[maxn],bfa[maxn];
int dis[maxn],sum[maxn],ml,len[maxn];
bool flag[maxn]; inline void adeg(int a,int b,int l){
eg[++ect].b=b;eg[ect].l=l;eg[ect].ne=egh[a];egh[a]=ect;
}
inline int getf(int x){return x==bfa[x]?x:bfa[x]=getf(bfa[x]);} void tarjan(int x){
flag[x]=;
for(int i=egh[x];i;i=eg[i].ne){
int b=eg[i].b;if(flag[b]) continue;
dis[b]=dis[x]+eg[i].l;tarjan(b);
bfa[getf(b)]=getf(x);
}
for(int i=qh[x];i;i=que[i].ne){
int b=que[i].b;if(!flag[b]) continue;
lca[i>>]=getf(b);
}
} void dfs(int x,int f,int n){
for(int i=egh[x];i;i=eg[i].ne){
int b=eg[i].b;if(b==f) continue;
dfs(b,x,n);sum[x]+=sum[b];
}
if(sum[x]>=n) ml=max(ml,dis[x]-dis[f]);
} inline bool judge(int m){
int c=,mm=;
memset(sum,,sizeof(sum));
for(int i=;i<=M;i++){
if(len[i]>m){
c++,mm=max(mm,len[i]);
sum[que[i<<].b]++;sum[que[i<<|].b]++;
sum[lca[i]]-=;
}
}
ml=;dfs(,,c);
return mm-ml<=m;
} int main(){
//freopen(".in","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<N;i++){
int a=rd(),b=rd(),c=rd();
adeg(a,b,c);adeg(b,a,c);
}
for(i=;i<=M;i++){
int a=rd(),b=rd();
que[i<<].b=b;que[i<<].ne=qh[a];qh[a]=i<<;
que[i<<|].b=a;que[i<<|].ne=qh[b];qh[b]=i<<|;
}
for(i=;i<=N;i++) bfa[i]=i;
tarjan();
int mil=3e8,mal=;
for(i=;i<=M;i++){
len[i]=dis[que[i<<].b]+dis[que[i<<|].b]-*dis[lca[i]];
mil=min(mil,len[i]);mal=max(mal,len[i]);
}
int l=max(mil-,),r=mal,ans;
while(l<=r){
int m=l+r>>;
if(judge(m)) ans=m,r=m-;
else l=m+;
}
printf("%d\n",ans);
return ;
}

luogu2680 [NOIp2015]运输计划 (tarjanLca+二分答案+树上差分)的更多相关文章

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

    题目链接  BZOJ4326 这个程序在洛谷上TLE了……惨遭卡常 在NOIP赛场上估计只能拿到95分吧= = 把边权转化成点权 首先求出每一条路径的长度 考虑二分答案,$check(now)$ 对于 ...

  2. LOJ2425 NOIP2015 运输计划 【二分+LCA+树上差分】*

    LOJ2425 NOIP2015 运输计划 LINK 题意:给你一颗树,可以将任意一条边的权值变成0,然后求m条路径的长度的最小值 思路: 先二分最后的距离ans,然后我们把路程大于ans的所有路径拿 ...

  3. bzoj4326: NOIP2015 运输计划(二分+LCA+树上差分)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4326 题目大意:有一颗含有n个顶点的树,每两个点之间有一个边权,现在有m个运输计划,每个 ...

  4. luoguP2680 运输计划 题解(二分答案+树上差分)

    P2680 运输计划  题目 这道题如果是看的我的树上差分来的,那么肯定一看题目就可以想到树上差分. 至于这是怎么想到的,一步一步来: 1.n有300000,不可能暴力枚举每一条边 2.因为我们要使运 ...

  5. NOIP2015运输计划(二分答案)

    题目描述 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有星球. 小P掌管一家物流公司,该公司有很多个运输计划,每 ...

  6. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  7. 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status] ...

  8. NOIP2015 运输计划(二分+LCA+差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status] ...

  9. BZOJ 4326:NOIP2015 运输计划(二分+差分+lca)

    NOIP2015 运输计划Description公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所 ...

随机推荐

  1. 01-时间复杂度、对数器(python)、冒泡、选择、递归实质、归并、小和问题、逆序对、mid

    1.时间复杂度 常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作. 时间复杂度为一个算法流程中,常数操作数量的指标.常用O(读作big O)来表示. 具体来说, ...

  2. 数组排列组合问题——BACKTRACKING

    BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...

  3. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...

  4. 数组-在Shell脚本中的基本使用介绍

    Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...

  5. PHP中报500错误时如何查看错误信息

    在执行代码中加入下面两行代码即可 ini_set("display_errors","On"); error_reporting(E_ALL);

  6. taro之React Native 端开发研究

    初步结论:如果想把 React Native 集成到现有的原生项目中,不能使用taro的React Native 端开发功能(目前来说不能实现,以后再观察).   RN开发有2种模式: 1.一是原生A ...

  7. 第八周--Linux中进程调度与进程切换的过程

    [潘恒 原创作品转载请注明出处 <Linux内核分析>MOOC课程 "http://mooc.study.163.com/course/USTC 1000029000 " ...

  8. python 生成器、列表解析式、yield、迭代器

    开局一张图总结关系 一.列表解析式 我们习惯生成列表通过list = [1, 2, 3]的方式.还有一种很方便的列表生成方式 list = [a*2 for a in range(10)],或者lis ...

  9. 『编程题全队』Beta 阶段冲刺博客三

    1.提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID) (1) 昨天已完成的工作 孙志威: 1.添加登录框的功能 2.修改登录框的UI 孙慧君: 1.提醒显示UI设计: 2 ...

  10. 【转】CSS颜色代码大全

    转自http://www.cnblogs.com/axing/archive/2011/04/09/CSS.html FFFFFF #DDDDDD #AAAAAA #888888 #666666 #4 ...