zoukankan      html  css  js  c++  java
  • AGC005 部分简要题解

    E

    首先注意到这个问题事实上非常复杂(两棵树上博弈),基础的转化无效,于是考虑简化情形。

    手玩很多样例可以发现,似乎很容易出现无限循环的情况,进一步地,有观察:

    • 若第一棵树上存在相邻点 (u, v) 在第二棵树上距离 (> 2),那么只要走到 (u, v) 其中一个点先手一定存在策略能够无限循环下去。

    显然走到哪个点是对称的,不妨假设走到 (u)
    那么先手可以在后手走到 (u) 在第二棵树上相邻点时移动到 (v),由于树上路径唯一,后手不可能在一次操作内移动到 (v)

    借此,我们将满足上述情形的点对称作关键点,它们的连边称作关键边。

    注意到我们不需要考虑关键边(因为走了关键边必定在此之前走到了关键点),于是我们将关键边全部删去,第一棵树变为森林,此时问题转化为:

    • 先手从 (X) 开始走,走到关键点赢,后手从 (Y) 开始追赶 (X) 碰到了后手赢(先手无法赢的时候尽可能最大化步数,后手尽可能最小化步数)。确定双方谁赢并且在后手赢的时候输出最大步数。

    由于此时第一棵树上的连边在第二棵树上距离 (le 2),因此考虑以第二棵树为主树将第一棵树在其上连虚边(这样方便观察)。

    此时貌似仍然没有头绪,考虑 弱化问题:所有第一棵树上连边在第二棵树上距离 (=1)

    此时显然有如下观察(证明不难):

    • 后手每次的最优策略一定是向先手方向移动。
    • 先手的最优策略一定是走到一个不会在路径过程中被后手撞到的(最远)位置然后乖乖等死,或找到一个不会在路径过程中被后手撞到的关键点(优先)。

    对于后者,不难发现这些位置 (u) 满足:(dis_{X, u} < dis_{Y, u})

    充分性显然,必要性可以考虑先手的最优策略。

    那么找到满足上述条件点中 (dis_{Y, u}) 的最大值即可,答案就是其的两倍。

    回到原问题,我们做类似的观察可以发现先手后手的最优策略与弱化问题一致!

    我们容易证明:先手在与后手距离 (le 2) 的时候最优策略是远离先手 / 不动(无路可走)。
    因此可以证明先手的最优策略。
    而后手的最优策略显然是先手最优策略下的答案上界。

    因此只需要找到可行点的判定条件即可。

    不难发现,此时一个点可行当且仅当:

    • 其在第一棵树上的所有祖先(以 (X) 为根)(u)(包含其本身)满足:(disA_{X, u} < disB_{Y, u})

    充分性考虑归纳证明。
    必要性容易通过先手在与后手距离 (le 2) 的时的必胜策略证明(先手不会在 (ge) 的位置继续向后手靠近)

    于是直接找到上述的可行点判定先手是否赢 / 后手赢情况下的最多次数即可。

    复杂度 (mathcal{O}(n log n)),瓶颈在于求树上两点距离,当然本题中只需要判定距离是否 (le 2),于是可以容易优化至 (mathcal{O}(n)),但没太大必要。

    GO!
  • 相关阅读:
    内存溢出和内存泄漏的区别
    各种集合类的区别以及原理
    如何设置java虚拟机参数
    [机器学习] 简单的机器学习算法和sklearn实现
    [机器视觉] SIFT特征-尺度不变特征理解
    [学习笔记] Markdown语法备忘
    [学习总结] python语言学习总结 (三)
    [学习笔记]Linux下mysql的基础操作
    [学习笔记] C++ 历年试题解析(三)--小补充
    [学习总结] python语言学习总结 (二)
  • 原文地址:https://www.cnblogs.com/Go7338395/p/15380189.html
Copyright © 2011-2022 走看看