zoukankan      html  css  js  c++  java
  • [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)\)

  • 相关阅读:
    每日日报
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    JAVA日报
  • 原文地址:https://www.cnblogs.com/akoasm/p/9408251.html
Copyright © 2011-2022 走看看