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,将图 ...
随机推荐
- Android -- 文件上传到服务器
1. 文件上传的两种方式 (1) HttpClient (2)AsyncHttpClient (开源框架: https://github.com/loopj/android-async-http) 示 ...
- vue element new vue const
new Vue{ el:"app", } ========= const app = new Vue({ router, data:{....} }).$mount('#app') ...
- 30分钟掌握Dart语言
在Dart中,一切都是对象,一切对象都是class的实例,哪怕是数字类型.方法甚至null都是对象,所有的对象都是继承自Object 虽然Dart是强类型语言,但变量类型是可选的因为Dart可以自动推 ...
- SpringIOC源码分析总结
大致的加载过程: spring ioc容器的加载,大体上经过以下几个过程: 资源文件定位.解析.注册.实例化 1.资源文件定位:主要发生在ApplicationContext中,由于applicati ...
- 转载--httpclient原理和应用
https://blog.csdn.net/wangpeng047/article/details/19624529/ 多谢大神的分享
- 【转】ext4+delalloc造成单次写延迟增加的分析
转自 http://blog.tao.ma/?p=58 这篇文章是淘宝内核组的刘峥同学在内部技术论坛上发表的一篇文章,但是由于刘峥同学目前没有blog,征得本人同意,贴在我的blog上,如果大家喜欢, ...
- 使用Easy4net编写代码生成器
在项目中经常要手动创建和数据库对应的实体类,如果数据库表比较多或者表字段比较多,那会是一个工作量非常大的事情,所以我根据自己的需求写了一个简单的代码生成工具,工具使用Easy4net框架开发. 下面是 ...
- ubuntu下自动备份mysql数据库
转载自:Mayi mysql的安装目录为:/var/lib/mysql 下面咱们来一起完成自动备份mysql. 备份目录为:/home/mydb 并且在每天下午18:30分以mysqldata_201 ...
- vue 自定义拖拽指令
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux服务器通过拷贝的方式安装多个tomcat
Tomcat占用资源少.运行速度快.安装配置简单,在个人开发中拥有广泛的使用者.很多人在使用中存在以下的误区:1.Tomcat必须通过eclipse启动2.Tomcat必须通过安装才能使用运行3.一台 ...