博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

[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)\)

posted @ 2018-08-02 17:02  Allorkiya  阅读(354)  评论(0编辑  收藏  举报