NOIP2015 运输计划(bzoj4326)
4326: NOIP2015 运输计划
Time Limit: 30 Sec Memory Limit: 128 MB
Submit: 886 Solved: 574
[Submit][Status][Discuss]
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。数据保证 1≤ai,bi≤n 且 0≤ti≤1000。接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j 个运输计划是从 uj 号星球飞往 vj号星球。数据保证 1≤ui,vi≤n
Output
输出文件只包含一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。
Sample Input
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
Sample Output
HINT
题解:
※整体思路:=-=明显的lca问题。对于此题,先树链剖分预处理所有计划的lca和计划用时,之后二分答案,用jud函数检验答案是否可行,最后输出最小值。
※jud函数:用树上差分。
如果要对一段连续区间 [a,b)[a,b) 同时加上一个值,只需在开始处加上这个值,在结束后减去这个值,维护前缀和就行了。看上去应该是这样的:
图片来自blog.sengxian.com:
若初始都是 00,让连续区间 [a,b)[a,b) 同时加上一个值 mm 之后,前缀和 Si=∑i0viSi=∑0ivi 即为元素 ii 的值(而其实对每个点i求1~i的前缀和即可求出它的实际值)。下面是前缀和:
如果有多组加减,也不会冲突。
同样的,在树上,我们用 sisi 来表示顶点 ii 到其父亲的这条边被经过的次数,vivi 用于记录顶点信息。
对于每个点对 (a,b)(a,b),我们将 va+1,vb+1,vLCA(a,b)−2va+1,vb+1,vLCA(a,b)−2。
则树上前缀和 si=∑k∈son(i)vksi=∑k∈son(i)vk。
利用 dfsdfs 序,对于每个点更新它的父亲的 ss 值,前缀和可以在 O(n)O(n) 的时间内算出来。这样,每条边经过的次数就顺利计算出来了。
这个方法的复杂度是线性的,为 O(m+n)O(m+n)。
程序如下:
1680299 | ksq2013 | 4326 | Accepted | 31448 kb | 3644 ms | C++/Edit | 2967 B | 2016-10-28 12:02:12 |
#include<bits/stdc++.h>
#define MAXN 310000
namespace F{
const int MAXBUF=<<;
inline char flow(){
static char B[MAXBUF],*S=B,*T=B;
if(S==T){
T=(S=B)+fread(B,,MAXBUF,stdin);
if(S==T)return ;
}
return *S++;
}
inline int read(){
static int x;
static char c;
for(;!isdigit(c=flow()););
for(x=c-;isdigit(c=flow());x=(x<<)+(x<<)+c-);
return x;
}
};
struct Pointer{int v,w;Pointer *nxt;}*fst[MAXN];
struct Plan{int u,v,lca,cost;}plan[MAXN];
inline void link(int u,int v,int w){
static Pointer mem[MAXN<<],*tot=mem;
*++tot=(Pointer){v,w,fst[u]},fst[u]=tot;
*++tot=(Pointer){u,w,fst[v]},fst[v]=tot;
}
int N,M,sz[MAXN],fa[MAXN],son[MAXN],top[MAXN],id[MAXN],d[MAXN],dep[MAXN],bin_var,s[MAXN];
void dfs_init(int x){
sz[x]=;
for(Pointer *j=fst[x];j;j=j->nxt)
if(j->v^fa[x]){
fa[j->v]=x;
d[j->v]=d[x]+j->w;
dep[j->v]=dep[x]+;
dfs_init(j->v);
sz[x]+=sz[j->v];
son[x]=sz[j->v]>sz[son[x]]?j->v:son[x];
}
}
void dfs_make(int x){
top[x]=(x==son[fa[x]])?top[fa[x]]:x;
static int ind;
id[++ind]=x;
if(son[x])dfs_make(son[x]);
for(Pointer *j=fst[x];j;j=j->nxt)
if(j->v^fa[x]&&j->v^son[x])
dfs_make(j->v);
}
inline int dis(int x,int y,int z)
{return d[x]+d[y]-(d[z]<<);}
inline int lca(int x,int y){
while(top[x]^top[y])
dep[top[x]]>dep[top[y]]?
x=fa[top[x]]:
y=fa[top[y]];
return dep[x]<dep[y]?x:y;
}
inline bool jud(int t){
int mxt=,sum=,ans=;
memset(s,,sizeof(s));
for(int i=;i<=M;i++){
if(plan[i].cost<=t)continue;
sum++;
s[plan[i].u]++,s[plan[i].v]++,s[plan[i].lca]-=;
if(plan[i].cost-t>mxt)
mxt=plan[i].cost-t;
}
for(int i=N;i>=;i--)
s[fa[id[i]]]+=s[id[i]];
for(int i=;i<=N;i++)
if((!(s[i]^sum))&&d[i]-d[fa[i]]>ans)
ans=d[i]-d[fa[i]];
return mxt<=ans;
}
void bin_search(){
int l,r,mid;
for(l=-,r=bin_var,mid;r-l>;){
mid=l+r>>;
jud(mid)?r=mid:l=mid;
}
printf("%d\n",r);
}
int main(){
using namespace F;
N=read(),M=read();
for(int i=,u,v,w;i<N;i++)
u=read(),v=read(),w=read(),link(u,v,w);
dfs_init();
dfs_make();
for(int i=,u,v;i<=M;i++){
u=read(),v=read();
plan[i]=(Plan){u,v};
plan[i].lca=lca(plan[i].u,plan[i].v);
plan[i].cost=dis(plan[i].u,plan[i].v,plan[i].lca);
if(plan[i].cost>bin_var)bin_var=plan[i].cost;
}
bin_search();
return ;
}
NOIP2015 运输计划(bzoj4326)的更多相关文章
- [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划
[BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划 试题描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− ...
- bzoj 4326: NOIP2015 运输计划
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个 ...
- [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组
[NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有 ...
- NOIP2015 运输计划(二分+LCA+差分)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 308 Solved: 208[Submit][Status] ...
- 数据结构(树链剖分):COGS 2109. [NOIP2015] 运输计划
2109. [NOIP2015] 运输计划 ★★★ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:1 s 内存限制:256 MB [题目描 ...
- BZOJ 4326 NOIP2015 运输计划 (二分+树上差分)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1930 Solved: 1231[Submit][Statu ...
- cogs2109 [NOIP2015] 运输计划
cogs2109 [NOIP2015] 运输计划 二分答案+树上差分. STO链剖巨佬们我不会(太虚伪了吧 首先二分一个答案,下界为0,上界为max{路径长度}. 然后判断一个答案是否可行,这里用到树 ...
- LOJ2425 NOIP2015 运输计划 【二分+LCA+树上差分】*
LOJ2425 NOIP2015 运输计划 LINK 题意:给你一颗树,可以将任意一条边的权值变成0,然后求m条路径的长度的最小值 思路: 先二分最后的距离ans,然后我们把路程大于ans的所有路径拿 ...
- AC日记——[NOIP2015]运输计划 cogs 2109
[NOIP2015] 运输计划 思路: 树剖+二分: 代码: #include <cstdio> #include <cstring> #include <iostrea ...
随机推荐
- curl命令学习笔记
下载文件并保存为默认文件名 curl -O http://www.xxx.com/xxx.exe 下载文件并保存为指定文件名 curl -o filename.exe http://www.xxx.c ...
- IOS开发--微信支付
前言:下面介绍微信支付的开发流程的细节,图文并茂,你可以按照我的随笔流程过一遍代码.包你也学会了微信支付.而且支付也是面试常问的内容. 正文: 1.首先在开始使用微信支付之前,有一些东西是开发者必须要 ...
- 出现( linker command failed with exit code 1)错误总结
这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误. ...
- Android 手机卫士--解析json与消息机制发送不同类型消息
本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,转载请注明源地址. 1.解析json数据 解析json的代码很简单 JSONObject jso ...
- 【代码笔记】iOS-离线地图
一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> #import <CoreLocation/CoreLoca ...
- IOS开发之UI布局
前言:本篇随笔会经常更新,随着本人对布局的深入学习,会不断补充新的知识.新的使用技巧.新的认识等等. 1.Autoresizing(在代码中使用) 先简单的看看下面的代码,以及左边运行出来的效果,然后 ...
- 列式存储(三)JFinal DB.tx()事务
上一篇中说道了列式存储中新增表单时后台接收数据问题,在存入数据库时一次插入多条数据,就要用到事务. JFinal中有个封装好的事务应用,用起来非常方便简单. 写法1: Db.tx(new IAtom( ...
- 网站错误记录:Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool.
今天看公司项目的错误日志文件,发现日志文件都是记录的这个错误. 经过网站查找,发现英文翻译是: 译:超时,与连接池的连接时间已过.这种情况发生是因为连接池在使用和最大连接池数目已满 通过翻译,可以看出 ...
- 软件开发与UML的关系
今天,我们上<统一建模语言UML>.课上老师给我们讲解了软件开发与UML之间的关系:UML常用于建立软件系统的模型,适用于系统开发的不同阶段.UML的应用贯穿于系统开发的不同阶段.1.需求 ...
- yii2 输出xml格式数据
作者:白狼 出处:http://www.manks.top/yii2_xml_response.html.html本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文 ...