D V D 和 V 的博弈游戏 DV


D e s c r i p t i o n \mathcal{Description} Description


S o l u t i o n \mathcal{Solution} Solution

前言: 这道题目状态的转移及代码的实现都较为简单, 但是证明过程却并不是那么轻松… 也许是我太蒻了吧

这里先给出实现核心,具体可以先看后面详解.

m a x _ v [ i ] , m i n _ v [ i ] <mtext>   </mtext> <mtext>   </mtext> i <mtext>   </mtext> , D a v i d , V a n . 设 max\_v[i], min\_v[i]\ 表示\ i\ 为根的子树, David,Van所能取得的各自的最优值. max_v[i],min_v[i]  i ,David,Van.
: m a x _ v [ i ] <mtext>   </mtext> i <mtext>   </mtext> D a v i d m a x _ v [ i ] , . 注: max\_v[i]表示在\ i\ 子树中David能取到第max\_v[i]大的数,表排名. :max_v[i] i Davidmax_v[i],.

对给出的树执行 D F S DFS DFS, 设当前节点为 i i i, <mtext>   </mtext> t o s o n [ i ] \ to ∈ son[i]  toson[i],
叶子节点 初值 m a x _ v [ i ] = m i n _ v [ i ] = 1 , max\_v[i]=min\_v[i]=1, max_v[i]=min_v[i]=1,

  1. i <mtext>   </mtext> D a v i d i\ 为David点 i David,
    m a x _ v [ i ] <mtext>   </mtext> = m a x ( m a x _ v [ t o ] ) max\_v[i]\ = max(max\_v[to]) max_v[i] =max(max_v[to])
    m i n _ v [ i ] = t o s o n [ i ] m i n _ v [ t o ] min\_v[i] =\sum_{to ∈ son[i]} min\_v[to] min_v[i]=toson[i]min_v[to]
  2. i <mtext>   </mtext> V a n i\ 为Van点 i Van,
    m a x _ v [ i ] <mtext>   </mtext> = t o s o n [ i ] m a x _ v [ t o ] max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to] max_v[i] =toson[i]max_v[to]
    m i n _ v [ i ] <mtext>   </mtext> = <mtext>   </mtext> m i n ( m i n _ v [ t o ] ) min\_v[i]\ =\ min(min\_v[to]) min_v[i] = min(min_v[to])

: 接下来是详细的解答过程 : :

1 1 如图1-1 11, 重点说明当前节点为 V a n Van Van时如何操作,


I . : \mathcal{I.} 情况 : I.: 子树仅包括叶子节点
首先要明确: <mstyle mathcolor="red"> , <mtext>   </mtext> <mtext>   </mtext> . </mstyle> \color{red}{从树上任意节点出发向下,最后必定到达\ 子节点全部是叶子\ 的节点}. ,  .
也就是图中画 <mstyle mathcolor="red"> </mstyle> \color{red}{红框} 的子树.
这个情况保证了 递归边界 的存在.
此时直接 m a x _ v [ i ] = m i n _ v [ i ] = 1 max\_v[i]=min\_v[i]=1 max_v[i]=min_v[i]=1 即可, 对应上方的 初始化


I I . : \mathcal{II.} 情况 : II.: D 子树包括一个叶子节点和一个 D 节点 D
设该叶子节点的值为 t t t, 最后取得 r e s res res, 考虑 V a n Van Van 如何走,

  1. t = m a x t=max t=max, 则 V a n Van Van 必定会走 D D D 节点, r e s = m a x res=max_次 res=max.
  2. t = m a x t=max_次 t=max, 此时 D D D 节点子树可以取得 m a x max max 值, 则 V a n Van Van 会往 t t t 走, r e s = m a x res=max_次 res=max
  3. t = m i d t=mid t=mid, 此时 r e s = m i d res=mid res=mid.

根据列举的三种情况, 发现 若不将 t t t 的值置为 m a x max max, 则答案不会更优.
扩展到多个 叶子节点, 同理可得 红色字体成立.


I I I . : \mathcal{III.} 情况 : III.: D 子树包括两个 D 节点 D
V a n Van Van 走了红节点, 必定是因为 走绿节点会使得 r e s res res 更大,
又因为绿节点中取得最大值 m a x _ t max\_t max_t 时, 需要 m a x _ t 1 max\_t-1 max_t1 个结点将其 <mstyle mathcolor="red"> &quot; &quot; </mstyle> \color{red}{&quot;垫上去&quot;} "".
这也就说明了绿节点中所有的数值 比 红节点中 最大数值 要大,
进而说明 红节点 取得的最大数值在这颗子树中的排名为 m a x _ v [ 绿 ] + m a x _ v [ ] max\_v[绿]+max\_v[红] max_v[绿]+max_v[].

推广到含多个 D D D 节点的情况, 可以得出结论: m a x _ v [ i ] <mtext>   </mtext> = t o s o n [ i ] m a x _ v [ t o ] max\_v[i]\ =\sum_{to ∈ son[i]} max\_v[to] max_v[i] =toson[i]max_v[to] ,
也就是上方的式子.

如果仔细观察, 可以发现 I I . 情况\mathcal{II.} II. I I I . 情况\mathcal{III.} III. 是可以看做同一类的,
因此简化转移的式子.

D a v i d David David 节点的处理方式与 V a n Van Van 的具有对称性, 这里不再赘述.

E N D END END.


C o d e \mathcal{Code} Code