分析:

mmp出题人太垃圾了
尼玛树链剖分 O(Nlog2N) O ( N l o g 2 N ) O(Nlog^2N)的算法跑得飞快,用LCA严格 O(NlogN) O ( N l o g N ) O(NlogN)的最后一个点却被卡了。

就因为出题人也写的树链剖分!所以他造的大数据就按着他不会T为标准。所以搞出来的数据用树链剖分或类似的方法都跑得飞快。

但我还是写一下只用 LCA L C A LCA的算法吧。。。
首先,如果加速的边有贡献,其必然加速了长度最大的一条路径。

所以在最大的路径上找边权最大的边,然后答案就是:max(最大路径长-最大边权,次大路径长)

若加速的边也在次大路径中,那么答案就跟新一个:max(最大路径长-公共路径最大边权,第三大路径长)

依次这么做下去,直到相交部分为空为止。

路径求交可以用lca水过去。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 300010
using namespace std;
void Read(int &x){x=0;char c;while(c=getchar(),c!=EOF&&(c<'0'||c>'9'))continue;x=c-'0';while(c=getchar(),c!=EOF&&c>='0'&&c<='9')x=x*10+c-'0';
}int n,m;
int fa[MAXN][20],deep[MAXN],len[MAXN][20],maxl[MAXN][20];
int val[MAXN],dist[MAXN];
int head[MAXN],nxt[MAXN*2],vax[MAXN*2],px[MAXN*2],cnt;
void add_edge(int x,int y,int va){cnt++;nxt[cnt]=head[x];px[cnt]=y;vax[cnt]=va;head[x]=cnt;
}
struct node{int u,v,val,lcax;bool operator < (const node &a)const{return val<a.val;}
}p[MAXN];
void dfs(int x,int f){for(int i=1;i<19&&fa[x][i-1];i++){fa[x][i]=fa[fa[x][i-1]][i-1];maxl[x][i]=max(maxl[x][i-1],maxl[fa[x][i-1]][i-1]);}deep[x]=deep[f]+1;for(int i=head[x];i;i=nxt[i]){int u=px[i];if(u==f)continue;fa[u][0]=x;maxl[u][0]=vax[i];dist[u]=dist[x]+vax[i];dfs(u,x);}
}
int quem(int u,int v){if(deep[u]<deep[v])swap(u,v);int res=0;for(int i=18;i>=0;i--)if(deep[fa[u][i]]>=deep[v]){res=max(res,maxl[u][i]);u=fa[u][i];}if(u==v)return res;for(int i=18;i>=0;i--)if(fa[u][i]!=fa[v][i]){res=max(res,maxl[u][i]);res=max(res,maxl[v][i]);u=fa[u][i];v=fa[v][i];}return max(res,max(maxl[u][0],maxl[v][0]));
}
inline int lca(int u,int v){if(deep[u]<deep[v])swap(u,v);int res=0;for(int i=18;i>=0;i--)if(deep[fa[u][i]]>=deep[v])u=fa[u][i];if(u==v)return u;for(int i=18;i>=0;i--)if(fa[u][i]!=fa[v][i]){u=fa[u][i];v=fa[v][i];}return fa[u][0];
}
int lower(int x,int y){if(deep[x]<deep[y])return y;return x;
}
pair<int,int> get_inter(int pp2,int pp1,int x,int y,int u,int v){int p1=lca(u,x),p2=lca(u,y);int p3=lca(v,x),p4=lca(v,y);pp1=lower(pp1,pp2);int A=lower(p1,p2);int B=lower(p3,p4);if(deep[A]<deep[pp1]&&deep[B]<deep[pp1])return make_pair(-1,-1);if(deep[A]<deep[pp1])A=pp1;if(deep[B]<deep[pp1])B=pp1;return make_pair(A,B);
}
int main(){Read(n),Read(m);int u,v,va;for(int i=1;i<n;i++){Read(u),Read(v),Read(va);add_edge(u,v,va);add_edge(v,u,va);}dfs(1,0);int maxv=0;for(int i=1;i<=m;i++){Read(p[i].u),Read(p[i].v);p[i].lcax=lca(p[i].u,p[i].v);p[i].val=dist[p[i].u]+dist[p[i].v]-(dist[p[i].lcax]<<1);}sort(p+1,p+1+m);maxv=max(maxv,p[m].val);pair<int,int> res=make_pair(p[m].u,p[m].v);int ans=max(p[m-1].val,maxv-quem(res.first,res.second));for(int i=m-1;i>=1;i--){res=get_inter(p[i].lcax,lca(res.first,res.second),res.first,res.second,p[i].u,p[i].v);if(res.first==res.second)break;ans=min(ans,max(p[i-1].val,maxv-quem(res.first,res.second)));if(maxv-quem(res.first,res.second)>p[i-1].val)break;}PF("%d",ans);
}

【图论】【LCA】NOIP2015运输计划相关推荐

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

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

  2. cogs2109 [NOIP2015] 运输计划

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

  3. 洛谷 2680 (NOIp2015) 运输计划

    题目:https://www.luogu.org/problemnew/show/P2680 因为是最长的时间最短,所以二分! 离线LCA可以知道路径长度.每次只看超过二分值的路径. 原本的想法是遍历 ...

  4. $Luogu2680/NOIp2015$ 运输计划

    传送门 $Sol$ 最暴力的做法就是枚举最长链上的边,然后再算一次所有的链长,更新$ans$. 这里要求最大的最小,容易想到二分答案.对于二分的值$mid$,扫一遍所有的链,若链长小于等于$mid$, ...

  5. 【Bzoj4326】运输计划

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

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

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

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

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

  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. PTA 基础编程题目集 7-7 12-24小时制 C语言
  2. Makefile选项 CFLAGS LDFLAGS
  3. 利用simhash计算文本相似度
  4. Microsoft Speech SDK 编程入门
  5. __doPostBack简单的使用方法
  6. fstat、stat和lstat 区别
  7. 笔记-网页内嵌Google地图与地理位置模拟
  8. jQuery零基础入门——(三)层级选择器
  9. excel if in函数_Office教程:Excel函数AVERAGE与IF函数的组合标记平均值
  10. 浅析GDAL库C#版本支持中文路径问题(续)
  11. lisp的vla函数画矩形_VisualLisp若干自定义函数
  12. Vue中router-link路由跳转以及传参方式
  13. 什么是 Sidecar
  14. 什么是CVR,CTR,CPC,CPA,ROI?
  15. 资产负债及银行资产负债业务
  16. 杰伦的《不能说的秘密》の细节 (详解)
  17. python读取以及保存gif图
  18. 17 个 JVM 参数
  19. 线上线下一体化趋势下,零售品牌如何利用线上营销为营收赋能?
  20. Linux nginx 项目部署

热门文章

  1. Python:zhdate模块农历日期处理
  2. React组件库Concis | 组件突破50+,移动端concis起步,新增英语文档,持续更新中...
  3. el-input去除上下箭头样式
  4. 多个img标签之间的间隔问题
  5. 2021 千字大厂面经 个人成长经验分享
  6. Solidworks二维图倒角功能的注意点
  7. 【混沌工程】故意破坏和混沌工程
  8. 用python开发物联网终端设备模拟器
  9. SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS 论文/GCN学习笔记
  10. 几种常见的摄影构图方法,让你拍起…