题解 最长道路tree】的更多相关文章

题目传送门 题目大意 给出一个\(n\)个点的树,每个点有点权,定义一条链的贡献为该链的点数乘上链上的权值和,求出树上所有链中的权值最大值. \(n\le 5\times 10^4\) 思路 算是我入边分治的门的一道题吧...借鉴了\(\texttt{Miracle}\)巨佬的图.代码以及思路(那不就是转载么???(大雾 边分治的大概意思就是说,对于给出的一棵树,我们重新构造成一颗3度树,并且保证我们要求答案的所需性质并不会丢失.然后有一个性质: 于是我们找到重心边分治一下,递归次数就是\(\l…
[BZOJ2870]最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都有一个拥挤程度v[i],我们认为从路口s走到路口t的痛苦程度为s到t的路径上拥挤程度的最小值,乘上这条路径上的路口个数所得的积.现在请你求出痛苦程度最大的一条路径,你只需输出这个痛苦程度. 简化版描述: 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积…
最长道路tree Description H城很大,有N个路口(从1到N编号),路口之间有N-1边,使得任意两个路口都能互相到达,这些道路的长度我们视作一样.每个路口都有很多车辆来往,所以每个路口i都有一个拥挤程度v[i],我们认为从路口s走到路口t的痛苦程度为s到t的路径上拥挤程度的最小值,乘上这条路径上的路口个数所得的积.现在请你求出痛苦程度最大的一条路径,你只需输出这个痛苦程度. Simple Description 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得…
题解: 子树分治的做法可以戳这里:http://blog.csdn.net/iamzky/article/details/41120733 可是码量... 这里介绍另一种好写又快的方法. 我们还是一颗一颗子树处理,处理完一个子树,考虑枚举最小值. 如果我们现在处理到了x节点,它到根的min为w. 那么我们就可以在以前的信息中找出min>=w且长度最长的一条链并且用它和该链合并,同时更新答案.这个显然可以用树状数组搞. 处理完一颗子树之后就全部把它加到树状数组里. 于是就O(nlog^2 n)了.…
题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每行两个数x.y,表示一条连接x和y的边 输出 一个数,表示最大的痛苦程度. 样例输入 3 5 3 5 1 2 1 3 样例输出 10 题解 树的直径+并查集 首先肯定是把权值从大到小排序,按照顺序加点,维护每个连通块的最长链乘以当前点权值作为贡献. 那么如何在加上一条边,连接两棵树后快速得出新的直径…
简化版描述: 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数.   有几个不同的做法: 1.sort+并查集+树的直径.边从大到小加入,并查集维护连通块,记录连通块的直径的两个端点,合并连通块的时候更新直径,并且用len*bian[i].w更新答案 有排序,O(nlogn) 2.点分治+树状数组.点分治路径合并的时候挺恶心.先都扫一遍所有子树,把路径最小值作为下标,链长作为权值放进树状数组里. 再枚举子树搜一遍,先减去当前子树的贡…
题意 (n<=50000) 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; long long cnt,head[N]; ]; long long fa[N]; long long n,a[N],b[N],book[N],ans; struct edge{ l…
挺好的一道题. 把所有点都离线下来,一个个往里加入就行了. #include <cstdio> #include <algorithm> #define N 100003 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,val[N]; namespace tree { int edges; int hd[N],…
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2870 思路 先把树转化为二叉树 再链分治 %%yyb 代码 #include <iostream> #include <algorithm> #include <cstring> #include <utility> #include <cstdio> #include <vector> #define ll long long…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2870 关于边分治:https://www.cnblogs.com/Khada-Jhin/p/10154994.html 自己写了那种把一个孩子连向自己,其他孩子连新建节点的重构图方法. 如果 vector 里最后一个元素恰好是父亲的话,末尾就会有一个新建节点只有一个孩子. solve( ) 完之后要继续 get_rt( ) ,想知道两边的点数 ts :可以发现 to[ cr ] 的部分点数…