zoukankan      html  css  js  c++  java
  • cf 701 E

    Descrition

    给你一颗(nle 2*10^5)个点的树, 有(2*k(2kle n))座大学座落在点上

    (任二大学不在同一个点)

    求一种两两匹配的方案, 使得距离和最大

    即$$maximize{sum_{eachpair(x,y)} dis(x,y)}$$

    Solution 1

    (1) 化简一下我们相当于要最小化 两两lca的深度和

    我们先把这2k所大学按dfn序从小到大排好, 把前k个称为A部分, 后k个称为B部分

    (2) 所有匹配均为(A-B)匹配

    ​ 如果存在一个(A-A')匹配, 那么一定也会存在一个$B-B' $匹配

    ​ 此时通过交换匹配, 显然一定可以变优

    (3) 引理: dfn区间[(x,y)]的公共lca 为 (lca(x,r)) (lca(l,r)), 其中(xle l le rle y)

    ​ 首先[x,y]的公共lca为点x,点y的lca是显然的

    (x o r)相当于走到子树或者向上回溯然后往下走

    ​ 如果(x-r)路径没有跨过lca, 如图1, 那么r-y就必定会跨过lca

    ​ 如果(x-r)路径跨国了lca, 如图2, 那么引理成立

    (4) 若(x<yin A), 那么(x' < y')

    ​ 如果存在(x<y<y'<x') , 我们可以交换匹配变成(x-y', y-x'), 解不会变差

    (lca(x, x') < one~of~lca(x, y')~and~lca(y, x'))

    (lca(y, y') < both~of~lca(x, y')~and~lca(y, x'))

    (5) 匹配为(i o i+k)

    ​ 根据(2) , (1)至少要匹配到(1+k)的位置

    ​ 根据((4)), 必须要(i o i+k), 才能保证匹配位置足够选择

    Solution 2

    考虑每条边(fa o x)

    (x)子树内有(sub[x])所大学

    那么(x)子树外有(2k-sub[x])所大学

    结论: 每条边被匹配 (min(sub[x], 2k- sub[x]))

    ​ 首先, 不可能超过这个次数

    ​ 然后, 如果小于, 那么子树内部有一对匹配, 子树外部有一对匹配

    ​ 通过交换匹配一定可以使得距离变长

    知道每条边被匹配多少次后, 貌似可以用启发式合并vec的方式构造解

    (行吧原题不要求构造解)

  • 相关阅读:
    代码重构技术方法
    《算法导论》为什么经典
    BeagleBone Black教训四局:简单LED对照实验
    linux(Ubuntu)安装QQ2013
    ubuntu卸载qq2012
    android弧形进度条,有详细注释的,比较简单
    Android自定义进度条
    AndroidのUI设计研究(一)——自定义ProgressBar
    介绍几个工作开发中封装的好用的android自定义控件
    android自定义viewgroup之我也玩瀑布流
  • 原文地址:https://www.cnblogs.com/acha/p/7541855.html
Copyright © 2011-2022 走看看