用了luogu上的题目描述

题目背景

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

题目描述

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

小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物

流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。

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

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

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

输入输出格式

输入格式:

输入文件名为 transport.in。

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

接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第

i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。

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

输出格式:

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

输入输出样例

输入样例#1:

6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
输出样例#1:

11

说明


 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; struct range {
int x,y,len;
bool operator < (const range &n1) const {
return len>n1.len;
}
}; const int maxn=; int root,n,m,x,y,tot,next[maxn],last[maxn],e[maxn],dep[maxn],fa[maxn],size[maxn],son[maxn],top[maxn],pos[maxn];
int pos2[maxn],val[maxn],cost[maxn],MAX[maxn],dist[maxn],s[maxn],node,ans,q[maxn];
range d[maxn]; inline int read()
{
char ch;
int re=;
bool flag=;
while((ch=getchar())!='-'&&(ch<''||ch>''));
ch=='-'?flag=:re=ch-'';
while((ch=getchar())>=''&&ch<='') re=(re<<)+(re<<)+ch-'';
return flag?-re:re;
} void add(int x,int y,int v)
{
next[++tot]=last[x];
last[x]=tot;
val[tot]=v;
e[tot]=y;
} void dfs1(int x)
{
dep[x]=dep[fa[x]]+;
size[x]=;
for (int i=last[x];i;i=next[i])
{
int v=e[i];
if (v==fa[x])continue;
fa[v]=x;
dist[v]=dist[x]+val[i];
cost[v]=val[i];
dfs1(v);
size[x]+=size[v];
if (size[v]>size[son[x]])son[x]=v;
}
} void dfs2(int x,int tp)
{
top[x]=tp;pos[x]=++node;pos2[node]=cost[x];
if (son[x]==)return;
dfs2(son[x],tp);
for (int i=last[x];i;i=next[i])
{
int v=e[i];
if (v==fa[x]||v==son[x])continue;
dfs2(v,v);
}
} int query(int x,int y)
{
int a=x,b=y;
while (top[a]!=top[b])
{
if (dep[top[a]]<dep[top[b]])std::swap(a,b);
a=fa[top[a]];
}
if (dep[a]<dep[b])return a;else return b;
} void work(int x,int y)
{
int a=x,b=y;
while (top[a]!=top[b])
{
if (dep[top[a]]<dep[top[b]])std::swap(a,b);
s[pos[top[a]]]+=;s[pos[a]+]-=;
a=fa[top[a]];
}
if (a==b)return;
if (dep[a]>dep[b]) std::swap(a,b);
s[pos[a]+]+=;s[pos[b]+]-=;;
} int check(int mid)
{
int sz=;
while (d[sz+].len>mid)sz++;
if (q[sz]!=) return q[sz];
std::memset(s,,sizeof(s));
for (int i=;i<=sz;i++)work(d[i].x,d[i].y);
int Maxx=,tott=;
for (int i=;i<=n;i++) {tott+=s[i];if (tott==(sz))Maxx=std::max(Maxx,pos2[i]);}
q[sz]=Maxx;
return Maxx;
} int main()
{
//freopen("temp.in","r",stdin);
n=read();m=read();
for (int i=;i<n;i++){
int v;
x=read();y=read();v=read();
add(y,x,v);add(x,y,v);
}
dfs1();
dfs2(,); for (int i=;i<=m;i++){
d[i].x=read();d[i].y=read();
d[i].len=dist[d[i].x]+dist[d[i].y]-*dist[query(d[i].x,d[i].y)];
} sort(d+,d++m); int l=,r=d[].len;
while (l<=r)
{
int mid=(l+r)>>;
if (d[].len-check(mid)>mid)
{
l=mid+;
}else r=mid-,ans=mid;
} printf("%d\n",ans); return ;
}

萎靡不振


你说害怕别人看见它 应该把它们撕碎吧

[noip 2015]运输计划 [LCA][树链剖分]的更多相关文章

  1. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  2. NOIP2015 运输计划 - 二分 + 树链剖分 / (倍增 + 差分)

    BZOJ CodeVS Uoj 题目大意: 给一个n个点的边带权树,给定m条链,你可以选择树中的任意一条边,将它置为0,使得最长的链长最短. 题目分析: 最小化最大值,二分. 二分最短长度mid,将图 ...

  3. 【NOIP 2015 DAY2 T3】 运输计划 (树链剖分-LCA)

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

  4. bzoj 4326: NOIP2015 运输计划【树链剖分+二分+树上差分】

    常数巨大,lg上开o2才能A 首先预处理出运输计划的长度len和lca,然后二分一个长度w,对于长度大于w的运输计划,在树上差分(d[u]+1,d[v]+1,d[lca]-2),然后dfs,找出所有覆 ...

  5. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  6. 4632 NOIP[2015] 运输计划

    4632 NOIP[2015] 运输计划  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解       题目描述 Description 公元 2044 ...

  7. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

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

  8. Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)

    Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...

  9. [BZOJ3626] [LNOI2014]LCA(树链剖分)

    [BZOJ3626] [LNOI2014]LCA(树链剖分) 题面 给出一棵N个点的树,要求支持Q次询问,每次询问一个点z与编号为区间[l,r]内的点分别求最近公共祖先得到的最近公共祖先深度和.N, ...

随机推荐

  1. [转]tomcat部署

    转载博客原文地址:  http://www.cnblogs.com/xing901022/p/4463896.html 阅读目录 介绍 静态部署——在tomcat启动时部署 动态部署——在tomcat ...

  2. IntelliJ IDEA 2017.1.4 x64配置说明

    只是为了研究下idea这款编译器怎么使用.开门见山,说下如何配置这款编译器,不配置也能用,但是强迫症表示不服.下面直入正题: 下载与安装就不说了,除了更改安装目录外,没啥注意的地方,建议下载idea去 ...

  3. 基于范围的for循环(STL)

    1. ]={4.99,5.99,6.99,7.99,8.99}; for (double x : prices) cout<<x<<endl; //////////////// ...

  4. python之numpy库[1]

    python-numpy python中的数据 一维数据 用列表和集合表示 数组与列表的关系 列表:数据类型可以不同 数组:数据类型可以相同 多维数据 用列表表示 高维数据 用字典表示 高维数据仅利用 ...

  5. 基于C#的Appium自动化测试框架(Ⅰ)

    因为工作原因,使用的编程语言都是C#,但是国内相应的Appium资料少得可怜,Java版本的Appium也考虑过,但是奈何自己搞不定Eclipse这个编译环境[说白了就是因为懒-- 无意中看到了外面的 ...

  6. thinkphp5.0学习笔记(二)

    本文为公司制作API接口后台的小结! 1.命名注意事项: 不要使用易混淆的名字,如index,index01... 我喜欢用拼音... 比如: public function zhuce(Reques ...

  7. ASP.NET MVC5(四):数据注解和验证

    前言 用户输入验证的工作,不仅要在客户端浏览器中执行,还要在服务端执行.主要原因是客户端验证会对输入数据给出即时反馈,提高用户体验:服务器端验证,主要是因为不能完全信任用户提供的数据.ASP.NET ...

  8. Linux下串口通信工具minicom的用法

    一.查看串口设备 例如,将USB转串口线插入交换机Console口后,执行命令:$ll /dev/ttyUSB* 二.连接串口设备 $sudo minicom -D /dev/ttyUSB0 三.设置 ...

  9. asp.net core中负载均衡场景下http重定向https的问题

    上周欣喜地发现,微软官方终于针对 asp.net core 在使用负载均衡的情况下从 http 强制重定向至 https 的问题提供了解决方法. app.UseForwardedHeaders(new ...

  10. 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本

    前言 承接前文<短信发送接口被恶意访问的网络攻击事件(二)肉搏战-阻止恶意请求>,文中有讲到一个定位非法IP的shell脚本,现在就来公布一下吧,并没有什么技术难度,只是当时花了些时间去写 ...