[WC2018 通道]

题目大意:给定三棵树,求点对\((x,y)\)使得\(d1(x,y) + d2(x,y) + d3(x,y)\)最大。

Solution:

前两棵树我们可以用构造虚树的方式来求\(d1(x,y) + d2(x,y)\)

记点对\((x,y)\)在第一棵树上的LCA是fa,那么\(dis_all(x,y) = dep1(x) + dep1(y) - dep1(fa) + dis2(x,y)\)

第二颗树考虑如何把第一棵树上的贡献粘贴上去,我们在每个点\(i\)连和\(i'\)连一条边权为\(dep1(i)\)的边,从下向上枚举\(LCA\)每次查询子树直径,合并时用一条边的两个端点合并。

而对于第三棵树,我们考虑边分治,首先要做的就是用多叉转二叉(左儿子右兄弟)来保证算法复杂度。

推荐倍增\(LCA\)

然后就是二叉树的树上\(Dsu\)

最终的时间复杂度\(O(n log n)\)

原文地址:https://www.cnblogs.com/akoasm/p/9408251.html