LOJ2425 NOIP2015 运输计划


LINK


题意:给你一颗树,可以将任意一条边的权值变成0,然后求m条路径的长度的最小值


思路:
先二分最后的距离ans,然后我们把路程大于ans的所有路径拿出来
然后把这些路径的交求出来,用树上差分的方法
然后对这个交(用点集转化成边集,就是每个点的上一条边)取一个最大值
然后判断这些边减去这个最大值之后会不会小于等于ans

 #include<bits/stdc++.h>
using namespace std;
#define fu(a,b,c) for(int a=b;a<=c;++a)
#define fd(a,b,c) for(int a=b;a>=c;--a)
int read(){
int ans=,w=;char c=getchar();
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')w=-,c=getchar();
while(isdigit(c))ans=(ans<<)+(ans<<)+c-'',c=getchar();
return ans*w;
}
const int N=3e5+;
struct Edge{int v,w,next;}E[N<<];
int head[N],tot=;
int n,m,l=,r=;
int cost[N],fro[N],to[N],lca[N];
int dis[N],dep[N],cnt[N],pre[N];
int fa[N][],Log2[N];
void add(int u,int v,int w){E[++tot]=(Edge){v,w,head[u]};head[u]=tot;}
void dfs(int u){
dep[u]=dep[fa[u][]]+;
fu(i,,Log2[dep[u]])fa[u][i]=fa[fa[u][i-]][i-];
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v==fa[u][])continue;
pre[v]=i;
fa[v][]=u;
dis[v]=dis[u]+E[i].w;
dfs(v);
}
}
void redfs(int u){
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v==fa[u][])continue;
redfs(v);
cnt[u]+=cnt[v];
}
}
int LCA(int x,int y){
if(dep[x]<dep[y])swap(x,y);
int t=dep[x]-dep[y];
fu(i,,Log2[t])if(t&(<<i))x=fa[x][i];
if(x==y)return x;
int k=Log2[dep[x]];
while(fa[x][]!=fa[y][]){
if(fa[x][k]!=fa[y][k]){
x=fa[x][k];
y=fa[y][k];
}
k--;
}
return fa[x][];
}
bool check(int vl){
int siz=;
fu(i,,n)cnt[i]=;
fu(i,,m){
if(cost[i]<=vl)continue;
siz++;
cnt[fro[i]]++;
cnt[to[i]]++;
cnt[lca[i]]-=;
}
redfs();
int maxv=;
fu(i,,n){
if(cnt[i]!=siz)continue;
maxv=max(maxv,E[pre[i]].w);
}
fu(i,,m)if(cost[i]-maxv>vl)return ;
return ;
}
int main(){
n=read();m=read();
Log2[]=;fu(i,,n)Log2[i]=Log2[i>>]+;
fu(i,,n-){
int u=read(),v=read(),w=read();
add(u,v,w);
add(v,u,w);
}
dfs();
fu(i,,m){
fro[i]=read(),to[i]=read();
lca[i]=LCA(fro[i],to[i]);
cost[i]=dis[fro[i]]+dis[to[i]]-(dis[lca[i]]<<);
r=max(r,cost[i]);
}
int ans;
while(l<=r){
int mid=(l+r*)/;
if(check(mid))r=mid-,ans=mid;
else l=mid+;
}
printf("%d",ans);
return ;
}

LOJ2425 NOIP2015 运输计划 【二分+LCA+树上差分】*的更多相关文章

  1. BZOJ 4326: NOIP2015 运输计划(二分,树上差分)

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

  2. P2680 运输计划[二分+LCA+树上差分]

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

  3. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  4. loj2425 「NOIP2015」运输计划[二分答案+树上差分]

    看到题意最小化最长路径,显然二分答案,枚举链长度不超过$\text{mid}$,然后尝试检验.````` 检验是否存在这样一个边置为0后,全部链长$\le\text{mid}$,其最终目标就是.要让所 ...

  5. 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)

    [题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...

  6. luogu P2680 运输计划 (二分答案+树上差分)

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

  7. BZOJ 4326 NOIP2015 运输计划 (二分+树上差分)

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

  8. [NOIP2015]运输计划 线段树or差分二分

    目录 [NOIP2015]运输计划 链接 思路1 暴力数据结构 思路2 二分树上差分 总的 代码1 代码2 [NOIP2015]运输计划 链接 luogu 好久没写博客了,水一篇波. 思路1 暴力数据 ...

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

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

随机推荐

  1. Nagios安装完后status map,trends等页面访问出错之解决

    首先,可以进入/usr/local/nagios/sbin, [root@localhost sbin]# ldd statusmap.cgi linux-vdso.so. => (0x0000 ...

  2. 外国人专门写了一篇文章,来分析为什么go在中国如此火

    外国人专门写了一篇文章,来分析为什么go在中国如此火: <Why is Golang popular in China?> http://herman.asia/why-is-go-pop ...

  3. poj 2229 Sumsets 完全背包求方案总数

    Sumsets Description Farmer John commanded his cows to search for different sets of numbers that sum ...

  4. RedLock 实现分布式锁

    J并发是程序开发中不可避免的问题,根据系统面向用户.功能场景的不同,并发的重视程度会有不同.从程序的角度来说,并发意味着相同的时间点执行了相同的代码,而有些情况是不被允许的,比如:转账.抢购占库存等, ...

  5. js三种对话框

    <html> <head> <script> function tip1(){ //这个基本没有什么说的,就是弹出一个提醒的对话框 alert("这个第一 ...

  6. html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例

    这篇文章主要介绍了html5本地存储的localstorage .本地数据库.sessionStorage简单使用示例,需要的朋友可以参考下 html5的一个非常cool的功能,就是web stora ...

  7. 使用ASP.NET 的缓存机制的示例

    if (HttpContext.Current.Cache["code_" + CodeType] == null) { SysCodeService codeService = ...

  8. spoj-SAMER08A-最短路

    SAMER08A - Almost Shortest Path #graph-theory #shortest-path #dijkstra-s-algorithm Finding the short ...

  9. day5-re模块

    一.概述 但凡有过语言开发经验的童鞋都清楚,很多时候需要进行字符串的匹配搜索.查找替换等处理,此时正则表达式就是解决问题的不二法门.正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强 ...

  10. js中页面加载完成后执行的几种方式及执行顺序

    1:使用jQuery的$(function){}; 2:使用jquery的$(document).ready(function(){});前两者本质上没有区别,第1种是第2种的简写方式.两个是docu ...