D和V的博弈游戏
Description


Solution
前言: 这道题目状态的转移及代码的实现都较为简单, 但是证明过程却并不是那么轻松… 也许是我太蒻了吧
这里先给出实现核心,具体可以先看后面详解.
设max_v[i],min_v[i] 表示 i 为根的子树,David,Van所能取得的各自的最优值.
注:max_v[i]表示在 i 子树中David能取到第max_v[i]大的数,表排名.
对给出的树执行 DFS, 设当前节点为 i, to∈son[i],
叶子节点 初值 max_v[i]=min_v[i]=1,
- i 为David点,
max_v[i] =max(max_v[to])
min_v[i]=∑to∈son[i]min_v[to]
- i 为Van点,
max_v[i] =∑to∈son[i]max_v[to]
min_v[i] = min(min_v[to])
接下来是详细的解答过程:

如图1−1, 重点说明当前节点为 Van时如何操作,
I.情况: 子树仅包括叶子节点
首先要明确: 从树上任意节点出发向下,最后必定到达 子节点全部是叶子 的节点.
也就是图中画 红框 的子树.
这个情况保证了 递归边界 的存在.
此时直接 max_v[i]=min_v[i]=1 即可, 对应上方的 初始化
II.情况: 子树包括一个叶子节点和一个D节点
设该叶子节点的值为 t, 最后取得 res, 考虑 Van 如何走,
- 若 t=max, 则 Van 必定会走 D 节点, res=max次.
- 若 t=max次, 此时 D 节点子树可以取得 max 值, 则 Van 会往 t 走, res=max次
- 若 t=mid, 此时 res=mid.
根据列举的三种情况, 发现 若不将 t 的值置为 max, 则答案不会更优.
扩展到多个 叶子节点, 同理可得 红色字体成立.
III.情况: 子树包括两个D节点
若 Van 走了红节点, 必定是因为 走绿节点会使得 res 更大,
又因为绿节点中取得最大值 max_t 时, 需要 max_t−1 个结点将其 "垫上去".
这也就说明了绿节点中所有的数值 比 红节点中 最大数值 要大,
进而说明 红节点 取得的最大数值在这颗子树中的排名为 max_v[绿]+max_v[红].
推广到含多个 D 节点的情况, 可以得出结论: max_v[i] =∑to∈son[i]max_v[to] ,
也就是上方的式子.
如果仔细观察, 可以发现 情况II. 与 情况III. 是可以看做同一类的,
因此简化转移的式子.
David 节点的处理方式与 Van 的具有对称性, 这里不再赘述.
END.
Code