【题意】n个点的树,m条链,求将一条边的权值置为0使得最大链长最小。

【算法】二分+树上差分

【题解】

最大值最小化问题,先考虑二分最大链长。

对所有链长>mid的链整体+1(树上差分)。

然后扫一遍,对[在所有不满足链上]的边取最大值并check。

具体做法:对于二分的最大链长,将所有链长>mid的链取最大值(链的数量记为num),然后用树上差分整体+1。

树上差分:a+1,b+1,lca(a,b)-2。dfs的时候判断子节点的连边(若子节点权=num则连边参与比较),然后再把子节点权加进来。

最后看最大边权是否>=最大链长和最长链的差值。

复杂度O(n log n)。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
const int maxn=;
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
int n,m,first[maxn],f[maxn][],deep[maxn],dis[maxn],sum,num,mx,a[maxn],b[maxn],c[maxn],d[maxn],tot=,s[maxn];
struct edge{int v,w,from;}e[maxn*];
void insert(int u,int v,int w){tot++;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;}
void dfs(int x,int fa){
for(int j=;(<<j)<=deep[x];j++)f[x][j]=f[f[x][j-]][j-];
for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){
deep[e[i].v]=deep[x]+;
dis[e[i].v]=dis[x]+e[i].w;
f[e[i].v][]=x;
dfs(e[i].v,x);
}
}
int lca(int x,int y){
if(deep[x]<deep[y])swap(x,y);
int d=deep[x]-deep[y];
for(int i=;(<<i)<=d;i++)if((<<i)&d)x=f[x][i];
if(x==y)return x;
for(int i=;i>=;i--)if((<<i)<=deep[x]&&f[x][i]!=f[y][i]){
x=f[x][i];y=f[y][i];
}
return f[x][];
}
void DFS(int x,int fa){
for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){
DFS(e[i].v,x);//zhi xing shun xu
if(s[e[i].v]>=num)mx=max(mx,e[i].w);
s[x]+=s[e[i].v];
}
}
bool check(int l){
int cha=;num=;
memset(s,,sizeof(s));
for(int i=;i<=m;i++)if(d[i]>l){
cha=max(cha,d[i]-l);
s[c[i]]-=;s[a[i]]++;s[b[i]]++;
num++;
}
mx=;sum=;
DFS(,);
if(mx>=cha)return ;else return ;
}
int main(){
n=read();m=read();
for(int i=;i<n;i++){
int u=read(),v=read(),w=read();
insert(u,v,w);insert(v,u,w);
}
dfs(,);
int l=,r=,mid;
for(int i=;i<=m;i++){
a[i]=read();b[i]=read();
c[i]=lca(a[i],b[i]);
d[i]=dis[a[i]]+dis[b[i]]-*dis[c[i]];
r=max(r,d[i]);
}
r++;
while(l<r){
mid=(l+r)>>;
if(check(mid))r=mid;
else l=mid+;
}
printf("%d",l);
return ;
}

dfs的时候注意操作顺序。

【NOIP】提高组2015 运输计划的更多相关文章

  1. 题解——洛谷 P2680 NOIP提高组 2015 运输计划

    树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...

  2. 题解 【luogu P2680 NOIp提高组2015 运输计划】

    题目链接 题解 题意 一棵树上有\(m\)条路径,可以将其中一条边的权值改为0,问最长的路径最短是多少 分析 最短的路径最长自然想到二分最长路径,设其为\(dis\) 关键在于如何check chec ...

  3. 树型大融合——NOIP提高组2015 D1T3 【运输计划】

    下午用一个小时看了一下树上差分,打了个差分模板,A了3题,真的爽! 题目描述: 公元2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 ...

  4. 【NOIP2015提高组】运输计划

    https://daniu.luogu.org/problem/show?pid=2680 使完成所有运输计划的时间最短,也就是使时间最长的运输计划耗时最短.最大值最小问题考虑用二分答案,每次chec ...

  5. NOIP2015_提高组Day2_3_运输计划

    这题思路很简单: 先对每个询问求距离,对距离由大到小排序, 二分最小距离,验证是否可行,验证时用差分处理: #include<iostream> #include<cstring&g ...

  6. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  7. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  8. 4632 NOIP[2015] 运输计划

    4632 NOIP[2015] 运输计划  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题解       题目描述 Description 公元 2044 ...

  9. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

随机推荐

  1. 软工实践Alpha冲刺(3/10)

    队名:我头发呢队 组长博客 作业博客 杰(组长) 过去两天完成了哪些任务 继续翻阅Google Material Design 2的官方文档 接下来的计划 音源爬取 还剩下哪些任务 app开发 燃尽图 ...

  2. centos7 安装 httpd并打开测试页

    systemctl start firewalld.service#启动firewallsystemctl stop firewalld.service#停止firewallsystemctl dis ...

  3. 【转载】Windows下Mysql5.7开启binlog步骤及注意事项

    转自:https://www.cnblogs.com/wangwust/p/6433453.html 1.查看是否开启了binlog:show binary logs; 默认情况下是不开启的. 2.开 ...

  4. SQL SERVER技术内幕之10 事务并发

    1.事务 1.1事务的定义 事务是作为单个工作单元而执行的一系列操作.定义事务边界有显式和隐式两种.显式事务的定义以BEGIN TRAN作为开始,以COMMIT TRAN提交事务,以ROLLBACK ...

  5. 第24天:js-函数变量声明提升

    一.函数声明1.自定义函数function fun1(){ alert("我是自定义函数");}fun2();//函数不调用,自己不执行2.直接量声明var fun2=functi ...

  6. HTML5拖拽表格中单元格间的数据库

    效果图:

  7. C++除法运算 // 静态断言

    1.C++中"/"运算:对两个整数做除法,结果仍为整数,如果它的商包含小数部分,则小树部分会被截除. C++ Primer 第五章 P130 2.静态断言(static_asser ...

  8. libsvm 用在 婚介数据集中 预测 用户配对

     分类前具备的数据集: 书本第九章数据集(训练集):agesonly.csv和matchmaker.csv. agesonly.csv 格式是: 男年龄,女年龄,是否匹配成功 24,30,1 30,4 ...

  9. c# 日志记录 行号

    Console.WriteLine(ex.Message); //通过如下代码来记录异常详细的信息 ); Console.WriteLine("文件名:{0},行号:{1},列号:{2}&q ...

  10. ARC077C pushpush 递推

    ---题面--- 题解: 貌似一般c题都是递推... 观察到最后一个插入的数一定在第一个,倒数第二个插入的数一定在倒数第一个,倒数第三个插入的数一定在第2个,倒数第四个插入的数一定在倒数第2个…… O ...