1 条题解

  • 0
    @ 2025-8-24 22:17:39

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Priestess_SLG
    为成为彼此风景而相遇 一旦回忆起也开始忘记

    搬运于2025-08-24 22:17:39,当前版本为作者最后更新于2025-08-18 20:28:22,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    比较经典的 Regret Greedy。前置知识 GSS9 trick:选中一条边之后将这条边的边权取反,下一次被选中的时候边权就可以直接抵消。

    先考虑一个错误的做法:每一次每一只鼹鼠贪心的前往这个距离最近的点,容易想到树形 dp 维护:设 fif_i 表示 ii 子树内前往一个能前往的点的最小距离,那么更新一个结点状态之后可以跳父亲结点更新所有的 fif_i 值,查询距一个点 ii 的最近可以前往点距离同样可以暴力跳父亲结点然后更新答案,因为树是二叉树,树高为 logn\log n,所以时间复杂度有保障。

    但是这显然是错的,因此考虑 Regret Greedy。考虑到若有一条边被不同方向经过了两次,那么不如交换路径然后不经过这条边优秀。此时考虑套用 GSS9 trick,记录每一条边从父亲往儿子结点走的路径数减去从儿子往父亲结点走的路径数:

    • 若路径数差 0\ge 0,则将儿子往父亲边权取反,另一方向边权不变。
    • 若路径树差 0\le 0,则将父亲往儿子边权取反,另一方向边权不变。

    这个差值显然可以简单更新,ff 数组内 dp 值的算法也是简单的,同时可以在更新 ff 数组的同时记录 gg 数组表示 ff 中对应的那个点,模拟上述流程,总时间复杂度为 O(nlogn)O(n\log n) 可以通过。

    代码,因为没有封装更新过程所以有点长。

    • 1

    信息

    ID
    5143
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者