D和V的博弈游戏D 和 V 的博弈游戏D和V的博弈游戏
Description\mathcal{Description}Description
Solution\mathcal{Solution}Solution
前言: 这道题目状态的转移及代码的实现都较为简单, 但是证明过程却并不是那么轻松… 也许是我太蒻了吧
这里先给出实现核心,具体可以先看后面详解.
设max_v[i],min_v[i] 表示 i 为根的子树,David,Van所能取得的各自的最优值.设 max\_v[i], min\_v[i]\ 表示\ i\ 为根的子树, David,Van所能取得的各自的最优值.设max_v[i],min_v[i] 表示 i 为根的子树,David,Van所能取得的各自的最优值.
注:max_v[i]表示在 i 子树中David能取到第max_v[i]大的数,表排名.注: max\_v[i]表示在\ i\ 子树中David能取到第max\_v[i]大的数,表排名.注:max_v[i]表示在 i 子树中David能取到第max_v[i]大的数,表排名.
对给出的树执行 DFSDFSDFS, 设当前节点为 iii, to∈son[i]\ to ∈ son[i] to∈son[i],
叶子节点 初值 max_v[i]=min_v[i]=1,max\_v[i]=min\_v[i]=1,max_v[i]=min_v[i]=1,
- i 为David点i\ 为David点i 为David点,
max_v[i] =max(max_v[to])max\_v[i]\ = max(max\_v[to])max_v[i] =max(max_v[to])
min_v[i]=∑to∈son[i]min_v[to]min\_v[i] =\sum_{to ∈ son[i]} min\_v[to]min_v[i]=∑to∈son[i]min_v[to]
- i 为Van点i\ 为Van点i 为Van点,
max_v[i] =∑to∈son[i]max_v[to]max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to]max_v[i] =∑to∈son[i]max_v[to]
min_v[i] = min(min_v[to])min\_v[i]\ =\ min(min\_v[to])min_v[i] = min(min_v[to])
接下来是详细的解答过程:接下来是详细的解答过程 :接下来是详细的解答过程:
如图1−1如图1-1如图1−1, 重点说明当前节点为VanVanVan时如何操作,
I.情况:\mathcal{I.} 情况 :I.情况: 子树仅包括叶子节点子树仅包括叶子节点子树仅包括叶子节点
首先要明确: 从树上任意节点出发向下,最后必定到达 子节点全部是叶子 的节点.\color{red}{从树上任意节点出发向下,最后必定到达\ 子节点全部是叶子\ 的节点}.从树上任意节点出发向下,最后必定到达 子节点全部是叶子 的节点.
也就是图中画 红框\color{red}{红框}红框 的子树.
这个情况保证了 递归边界 的存在.
此时直接 max_v[i]=min_v[i]=1max\_v[i]=min\_v[i]=1max_v[i]=min_v[i]=1 即可, 对应上方的 初始化
II.情况:\mathcal{II.} 情况 :II.情况: 子树包括一个叶子节点和一个D节点子树包括一个叶子节点和一个 D 节点子树包括一个叶子节点和一个D节点
设该叶子节点的值为 ttt, 最后取得 resresres, 考虑 VanVanVan 如何走,
- 若 t=maxt=maxt=max, 则 VanVanVan 必定会走 DDD 节点, res=max次res=max_次res=max次.
- 若 t=max次t=max_次t=max次, 此时 DDD 节点子树可以取得 maxmaxmax 值, 则 VanVanVan 会往 ttt 走, res=max次res=max_次res=max次
- 若 t=midt=midt=mid, 此时 res=midres=midres=mid.
根据列举的三种情况, 发现 若不将 ttt 的值置为 maxmaxmax, 则答案不会更优.
扩展到多个 叶子节点, 同理可得 红色字体成立.
III.情况:\mathcal{III.} 情况 :III.情况: 子树包括两个D节点子树包括两个 D 节点子树包括两个D节点
若 VanVanVan 走了红节点, 必定是因为 走绿节点会使得 resresres 更大,
又因为绿节点中取得最大值 max_tmax\_tmax_t 时, 需要 max_t−1max\_t-1max_t−1 个结点将其 "垫上去"\color{red}{"垫上去"}"垫上去".
这也就说明了绿节点中所有的数值 比 红节点中 最大数值 要大,
进而说明 红节点 取得的最大数值在这颗子树中的排名为 max_v[绿]+max_v[红]max\_v[绿]+max\_v[红]max_v[绿]+max_v[红].
推广到含多个 DDD 节点的情况, 可以得出结论: max_v[i] =∑to∈son[i]max_v[to]max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to]max_v[i] =∑to∈son[i]max_v[to] ,
也就是上方的式子.
如果仔细观察, 可以发现 情况II.情况\mathcal{II.}情况II. 与 情况III.情况\mathcal{III.}情况III. 是可以看做同一类的,
因此简化转移的式子.
DavidDavidDavid 节点的处理方式与 VanVanVan 的具有对称性, 这里不再赘述.
ENDENDEND.
Code\mathcal{Code}Code