【NOIP2015】运输计划(二分,差分)

时间:2022-12-28 07:36:39

题面

Description

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

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

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

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

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

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

Input

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

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

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

Output

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

Sample Input

6 3

1 2 3

1 6 4

3 1 7

4 3 6

3 5 5

3 6

2 5

4 5

Sample Output

11

题解

多么好的一道题目。。。。

既然每一条航道都是在树上跑

显然是要求LCA的(所以我用的熟练剖分)

把问题简化一下:

有若干条树上的路径

将一条边的长度变为零之后,最长距离的最小值是多少

最长距离的最小值,想到的是二分答案

那么,现在的问题又变成了,如何检查答案。

对于每一个二分出来的时间

如果某个路径的长度小于这个时间,那么这个航道做不做改动都是无所谓的

反过来,显然就至少需要修改一条航道

那么,如果是一条满足条件的边修改为0,那么一定存在所有的其他需要修改的航道都经过了这条边(要不然他们就不会减少了)

所以在树上进行差分

每一次沿着路径统计当前这条边是否可以减少

然后判断一下减少的量够不够(就是最长的航道和当前的时间的差)

就可以判断可行性了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std; #define MAX 301000
#define INF 1000000000 inline int read()
{
register int x=0,t=1;
register char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
} struct Line
{
int v,next,w;
}e[MAX*3]; int size[MAX],dfn[MAX],f[MAX],hson[MAX],top[MAX];
int c[MAX],t[MAX],N,M,dis[MAX];
int h[MAX],cnt=1,tim,line[MAX],ln[MAX],dep[MAX]; inline void Add(int u,int v,int w)
{
e[cnt]=(Line){v,h[u],w};
h[u]=cnt++;
} struct Plan
{
int u,v,d;
}p[MAX];
bool operator <(Plan a,Plan b)
{
return a.d<b.d;
} void DFS1(int u,int ff)
{
hson[u]=0;size[u]=1;f[u]=ff;dep[u]=dep[ff]+1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==ff)continue;
dis[v]=dis[u]+e[i].w;
ln[v]=e[i].w;
DFS1(v,u);
if(size[v]>size[hson[u]])hson[u]=v;
size[u]+=size[v];
}
} void DFS2(int u,int tp)
{
top[u]=tp;dfn[u]=++tim;line[tim]=u;
if(hson[u])DFS2(hson[u],tp);
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==f[u]||v==hson[u])continue;
DFS2(v,v);
}
} inline int LCA(int u,int v)
{
int tp1=top[u],tp2=top[v];
while(tp1!=tp2)
{
if(dep[tp1]<dep[tp2]){swap(tp1,tp2);swap(u,v);}
u=f[tp1];tp1=top[u];
}
if(dep[u]<dep[v])swap(u,v);
return v;
} inline void Count(int u,int v)
{
int tp1=top[u],tp2=top[v];
while(tp1!=tp2)
{
if(dep[tp1]<dep[tp2]){swap(tp1,tp2);swap(u,v);}
c[dfn[tp1]]++;c[dfn[u]+1]--;
u=f[tp1];tp1=top[u];
}
if(dep[u]<dep[v])swap(u,v);
c[dfn[u]+1]--;c[dfn[v]+1]++;
} inline bool Check(int tt)
{
int sum=0;
memset(c,0,sizeof(c));
if(p[M].d<=tt)return true;
for(int i=M;i;--i)
{
if(p[i].d<=tt)break;
sum++;
Count(p[i].u,p[i].v);
}
int ss=0;
for(int i=1;i<=N;++i)
{
ss+=c[i];
if(ss==sum)
{
if(p[M].d-ln[line[i]]<=tt)return true;
}
}
return false;
} int main()
{
N=read();M=read();
for(int i=1;i<N;++i)
{
int u=read(),v=read(),w=read();
Add(u,v,w);Add(v,u,w);
} DFS1(1,0);DFS2(1,1); for(int i=1;i<=M;++i)
{
p[i].u=read();p[i].v=read();
p[i].d=dis[p[i].u]+dis[p[i].v]-2*dis[LCA(p[i].u,p[i].v)];
} sort(&p[1],&p[M+1]); int l=0,r=INF;
while(l<r)
{
int mid=(l+r)>>1;
if(Check(mid))r=mid;
else l=mid+1;
} printf("%d\n",l); return 0;
}

【NOIP2015】运输计划(二分,差分)的更多相关文章

  1. BZOJ 4326 NOIP2015 运输计划 &lpar;二分&plus;树上差分&rpar;

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1930  Solved: 1231[Submit][Statu ...

  2. BZOJ 4326&colon; NOIP2015 运输计划&lpar;二分,树上差分&rpar;

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1945  Solved: 1243[Submit][Status][Discuss] Descript ...

  3. JZYZOJ1454 NOIP2015 D2T3&lowbar;运输计划 二分 差分数组 lca tarjan 树链剖分

    http://172.20.6.3/Problem_Show.asp?id=1454 从这道题我充分认识到我的脑子里好多水orz. 如果知道了这个要用二分和差分写,就没什么思考上的难点了(屁咧你写了一 ...

  4. 【bzoj4326】&lbrack;NOIP2015&rsqb;运输计划 二分答案&plus;LCA

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

  5. NOIP2015 运输计划 &lpar;树上差分&plus;二分答案&rpar;

    ---恢复内容开始--- 题目大意:给你一颗树,你可以把其中一条边的边权改成0,使给定的一些树链的权值和的最大值最小 把lenth定义为未修改边权时的答案 考虑二分答案,如果二分的答案成立,设修改成0 ...

  6. NOIP2015 运输计划 - 二分 &plus; 树链剖分 &sol; (倍增 &plus; 差分)

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

  7. cogs2109 &lbrack;NOIP2015&rsqb; 运输计划

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

  8. &lbrack;NOIP2015&rsqb;运输计划 D2 T3 LCA&plus;二分答案&plus;差分数组

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

  9. NOIP2015 运输计划(二分&plus;LCA&plus;差分)

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

  10. BZOJ 4326 NOIP2015 运输计划(树上差分&plus;LCA&plus;二分答案)

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

随机推荐

  1. 微信小程序开发工具的数据&comma;配置&comma;日志等目录在哪儿&quest; 怎么找&quest;

    原文地址:http://www.wxapp-union.com/portal.php?mod=view&aid=359 本文由本站halfyawn原创:感谢原创者:如有疑问,请在评论内回复   ...

  2. innodb数据库批量转换表引擎为MyISAM

    2013.0106 innodb数据库批量转换表引擎为MyISAM 来源:本站原创 PHP, 数据库, 系统技术 超过488名童鞋围观 1条评论  <?php //连接数据库 $host='lo ...

  3. Java 中最常见的 5 个错误

    在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...

  4. UITextField的简单操作和实际应用

    UITestField UITestField* testField = [UITestField alloc]initWithFrame]; /* 设置边框样式 typedef NS_ENUM(NS ...

  5. bzoj 2734&colon; &lbrack;HNOI2012&rsqb;集合选数 状压DP

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 321[Submit][Status ...

  6. PHP函数&colon;PHP&lowbar;SELF

    php_self是php的内置变量,记作$php_self,其作用是实现“页内跳转”.这里的页内跳转不同等于html的书签之类的跳转,而是php程序通过URL的尾参数的改变在同一个程序里提供不同的We ...

  7. 五分钟学习React&lpar;三&rpar;:纯HTML代码搭建React应用

    上一期我们使用了React官方的脚手架运行React应用.大家可能会觉得这种方法很繁琐,需要配置各种第三方插件.JQuery时代的前端真是让人怀念.这一期,我就带领大家创建一个"怀旧版&qu ...

  8. iOS-AFNetworking封装Get&lpar;自定义HTTP Header&rpar;和Post请求及文件下载

    前面提到AFNetworking是一个很强大的网络三方库,首先你需要引入AFNetworking三方库:如封装的有误还请指出,谢谢! 1.Get请求 /**Get请求 url 服务器请求地址 succ ...

  9. css实现礼券效果2

    <template> <div class="quan clear"> <div class="quanleft"> &lt ...

  10. Redis深入学习笔记(五)Redis阻塞原因

    在实际使用Redis中,有时会碰到客户端timeout异常,或者没有可用连接异常等等异常,总结大概有如下原因: 内部阻塞原因: 1)大对象存取. 2)Fork阻塞. 3)Aof刷盘阻塞(距离上次刷盘大 ...