公元 2044 年,人类进入了宇宙纪元。

L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球。

小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰。

为了鼓励科技创新, L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。

在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后,这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的物流公司的阶段性工作就完成了。

如果小 P 可以自由选择将哪一条航道改造成虫洞, 试求出小 P 的物流公司完成阶段性工作所需要的最短时间是多少?

输入格式

第一行包括两个正整数 n,m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。

接下来 n−1 行描述航道的建设情况,其中第 i 行包含三个整数 ai,bi 和 ti,表示第 i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。数据保证 1≤ai,bi≤n 且 0≤ti≤1000。

接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j 个运输计划是从 uj 号星球飞往 vj号星球。数据保证 1≤ui,vi≤n

输出格式

输出文件只包含一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。

样例一

input

6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5

output

11

explanation

将第 1 条航道改造成虫洞: 则三个计划耗时分别为:11,12,11,故需要花费的时间为 12。

将第 2 条航道改造成虫洞: 则三个计划耗时分别为:7,15,11,故需要花费的时间为 15。

将第 3 条航道改造成虫洞: 则三个计划耗时分别为:4,8,11,故需要花费的时间为 11。

将第 4 条航道改造成虫洞: 则三个计划耗时分别为:11,15,5,故需要花费的时间为 15。

将第 5 条航道改造成虫洞: 则三个计划耗时分别为:11,10,6,故需要花费的时间为 11。

故将第 3 条或第 5 条航道改造成虫洞均可使得完成阶段性工作的耗时最短,需要花费的时间为 11。

限制与约定

测试点编号 n的取值 m的取值 约定
1 =100 =1  
2 =100 第 i 条航道连接 i 号星球与 i+1 号星球
3  
4 =2000 =1
5 =1000 =1000 第 i 条航道连接 i 号星球与 i+1 号星球
6 =2000 =2000
7 =3000 =3000
8 =1000 =1000  
9 =2000 =2000
10 =3000 =3000
11 =80000 =1
12 =100000
13 =70000 =70000 第 i 条航道连接 i 号星球与 i+1 号星球
14 =80000 =80000
15 =90000 =90000
16 =100000 =100000
17 =80000 =80000  
18 =90000 =90000
19 =100000 =100000
20 =300000 =300000

时间限制:1s

空间限制:256MB

跪了。。。。。。。。。

考场想了一个奇怪的树链剖分的做法,最后发现是有问题的。。。。。(希望能多拿点分)

这道题真是水题。。。。。

将边权附到出边的点权,二分答案,找出所有不符合题意的路径,这些路径上必须删至少一条边。算出这些链的交集,可以离线打标记,然后判判就行了。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;
}
const int maxn=300010;
int n,m,first[maxn],next[maxn<<1],to[maxn<<1],dis[maxn<<1],e;
void AddEdge(int u,int v,int w) {to[++e]=v;dis[e]=w;next[e]=first[u];first[u]=e;to[++e]=u;dis[e]=w;next[e]=first[v];first[v]=e;
}
int val[maxn],u[maxn],v[maxn],w[maxn],fa[maxn],siz[maxn],son[maxn],dep[maxn],dist[maxn];
void dfs(int x) {dep[x]=dep[fa[x]]+1;siz[x]=1;ren if(to[i]!=fa[x]) {fa[to[i]]=x;dist[to[i]]=dist[x]+dis[i];dfs(to[i]);siz[x]+=siz[to[i]];if(siz[to[i]]>siz[son[x]]) son[x]=to[i];}
}
int top[maxn];
void build(int x,int tp) {top[x]=tp;if(son[x]) build(son[x],tp);ren if(to[i]!=fa[x]&&to[i]!=son[x]) build(to[i],to[i]);
}
int lca(int x,int y) {int f1=top[x],f2=top[y];while(f1!=f2) {if(dep[f1]<dep[f2]) swap(f1,f2),swap(x,y);x=fa[f1];f1=top[x];}return dep[x]<dep[y]?x:y;
}
int tot,mx2,A[maxn],B[maxn],C[maxn],LCA[maxn],cnt[maxn];
int dfs2(int x) {ren if(to[i]!=fa[x]) cnt[x]+=dfs2(to[i]);if(cnt[x]==tot) mx2=max(mx2,val[x]);return cnt[x];
}
int check(int mid) {memset(cnt,0,sizeof(cnt));int mx=0;tot=mx2=0;rep(i,1,n) if(C[i]>mid) {mx=max(mx,C[i]);cnt[A[i]]++;cnt[B[i]]++;cnt[LCA[i]]-=2;tot++;}dfs2(1);return mx-mx2<=mid;
}
int main() {n=read();m=read();rep(i,2,n) {u[i]=read();v[i]=read();w[i]=read();AddEdge(u[i],v[i],w[i]);}dfs(1);build(1,1);rep(i,2,n) {if(dep[u[i]]>dep[v[i]]) val[u[i]]=w[i];else val[v[i]]=w[i];}int l=0,r=0,mid;rep(i,1,m) {A[i]=read();B[i]=read();r=max(r,C[i]=dist[A[i]]+dist[B[i]]-2*dist[LCA[i]=lca(A[i],B[i])]);}while(l<r) if(check(mid=l+r>>1)) r=mid; else l=mid+1;printf("%d\n",l);return 0;
}

View Code

转载于:https://www.cnblogs.com/wzj-is-a-juruo/p/4950853.html

【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. 【图论】【LCA】NOIP2015运输计划

    分析: mmp出题人太垃圾了 尼玛树链剖分 O(Nlog2N) O ( N l o g 2 N ) O(Nlog^2N)的算法跑得飞快,用LCA严格 O(NlogN) O ( N l o g N ) ...

  6. 【Bzoj4326】运输计划

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

  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. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

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

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

最新文章

  1. 小程序开发填坑汇总贴
  2. 2.4.安装spaCy
  3. 关于jQuery.click()函数
  4. android二分查找法简书,【PYTHON】二分查找算法
  5. php变量在html调用函数调用,PHP_如何在html标记中调用的函数里传递对象,最近使用jquery结合Ajax开发一个 - phpStudy...
  6. Linux下用多种模式实现双网卡绑定!
  7. bzoj1088: [SCOI2005]扫雷Mine
  8. Android轉檔案到iphone,在 Mac 上要如何存取 Android 手機中的檔案,傳輸檔案沒問題...
  9. lamp mysql登录_LAMP 3.2 mysql登陆
  10. golang区块链开发的视频教程推荐
  11. 微信公众号H5合成图片长按下载
  12. React的调和过程(Reconcilliation)
  13. 优矿python开源_PythonStock(8):使用优矿web学习python入门
  14. nagios使用nsca实现被动监控
  15. Win10电脑一直循环重启进不了系统桌面怎么办
  16. sanf()、kbhit()、getch()获取键盘信息与peekMessage()获取鼠标信息
  17. 前后端分离-----SEO优化
  18. vue 简介 (MVVM介绍,超详细)
  19. 多条Qt开发常见问题及解决方法汇总
  20. 笨办法学习python应该看第几版_笨办法学习python

热门文章

  1. 令程序员们夜不能寐的“噩梦”除了改需求,还有这些…...
  2. 自学鄙视链顶端的王者
  3. 高并发架构系列:Kafka、RocketMQ、RabbitMQ的优劣势比较
  4. mysql基础之数据库变量(参数)管理
  5. Linux 命令学习(1): head和tail
  6. JavaScript中Array类型方法总结
  7. java中方法体的作用
  8. (并查集) Wireless Network --POJ --2236
  9. Mac端将本地新项目上传到github
  10. django.db.utils.OperationalError: (1049, Unknown database 'djangodb')