LOJ2425 NOIP2015 运输计划 【二分+LCA+树上差分】*
LOJ2425 NOIP2015 运输计划
题意:给你一颗树,可以将任意一条边的权值变成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+树上差分】*的更多相关文章
- BZOJ 4326: NOIP2015 运输计划(二分,树上差分)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1945 Solved: 1243[Submit][Status][Discuss] Descript ...
- P2680 运输计划[二分+LCA+树上差分]
题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间,这 n-1n−1 条航道连通了 LL 国的所有星球. 小 ...
- [luogu]P2680 运输计划[二分答案][树上差分]
[luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...
- loj2425 「NOIP2015」运输计划[二分答案+树上差分]
看到题意最小化最长路径,显然二分答案,枚举链长度不超过$\text{mid}$,然后尝试检验.````` 检验是否存在这样一个边置为0后,全部链长$\le\text{mid}$,其最终目标就是.要让所 ...
- 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)
[题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...
- luogu P2680 运输计划 (二分答案+树上差分)
题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...
- BZOJ 4326 NOIP2015 运输计划 (二分+树上差分)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1930 Solved: 1231[Submit][Statu ...
- [NOIP2015]运输计划 线段树or差分二分
目录 [NOIP2015]运输计划 链接 思路1 暴力数据结构 思路2 二分树上差分 总的 代码1 代码2 [NOIP2015]运输计划 链接 luogu 好久没写博客了,水一篇波. 思路1 暴力数据 ...
- NOIP2015 运输计划 - 二分 + 树链剖分 / (倍增 + 差分)
BZOJ CodeVS Uoj 题目大意: 给一个n个点的边带权树,给定m条链,你可以选择树中的任意一条边,将它置为0,使得最长的链长最短. 题目分析: 最小化最大值,二分. 二分最短长度mid,将图 ...
随机推荐
- Nagios安装完后status map,trends等页面访问出错之解决
首先,可以进入/usr/local/nagios/sbin, [root@localhost sbin]# ldd statusmap.cgi linux-vdso.so. => (0x0000 ...
- 外国人专门写了一篇文章,来分析为什么go在中国如此火
外国人专门写了一篇文章,来分析为什么go在中国如此火: <Why is Golang popular in China?> http://herman.asia/why-is-go-pop ...
- poj 2229 Sumsets 完全背包求方案总数
Sumsets Description Farmer John commanded his cows to search for different sets of numbers that sum ...
- RedLock 实现分布式锁
J并发是程序开发中不可避免的问题,根据系统面向用户.功能场景的不同,并发的重视程度会有不同.从程序的角度来说,并发意味着相同的时间点执行了相同的代码,而有些情况是不被允许的,比如:转账.抢购占库存等, ...
- js三种对话框
<html> <head> <script> function tip1(){ //这个基本没有什么说的,就是弹出一个提醒的对话框 alert("这个第一 ...
- html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
这篇文章主要介绍了html5本地存储的localstorage .本地数据库.sessionStorage简单使用示例,需要的朋友可以参考下 html5的一个非常cool的功能,就是web stora ...
- 使用ASP.NET 的缓存机制的示例
if (HttpContext.Current.Cache["code_" + CodeType] == null) { SysCodeService codeService = ...
- spoj-SAMER08A-最短路
SAMER08A - Almost Shortest Path #graph-theory #shortest-path #dijkstra-s-algorithm Finding the short ...
- day5-re模块
一.概述 但凡有过语言开发经验的童鞋都清楚,很多时候需要进行字符串的匹配搜索.查找替换等处理,此时正则表达式就是解决问题的不二法门.正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强 ...
- js中页面加载完成后执行的几种方式及执行顺序
1:使用jQuery的$(function){}; 2:使用jquery的$(document).ready(function(){});前两者本质上没有区别,第1种是第2种的简写方式.两个是docu ...