1. 程式人生 > 其它 >【題解】CF1628D2 Game on Sum (Hard Version)

【題解】CF1628D2 Game on Sum (Hard Version)

題目傳送門

思路

這是一道DP題。

所以我們來設狀態,我們讓 \(dp_{i,j}\) 表示在第 i 次操作後, Bob 選擇“加”了 j 次,那麼顯然最後的答案是 \(dp_{n,m}\)

再來看轉移:

\(dp_{i,j}\) 的 i 一定由 i-1 轉移而來,而 j 則取決於 Bob 加不加,所以可以貢獻給它的狀態是 \(dp_{i-1,j}\)\(dp_{i-1,j-1}\)

反過來說, \(dp_{i,j}\) 可以給 \(dp_{i+1,j}\)\(dp_{i+1,j+1}\) 作出貢獻。

先考慮轉移。

顯然,Alice 作出決策後, Bob 會在 \(dp_{i-1,j}-t\)

\(dp_{i-1,j-1}+t\) 中選擇最小的一個。

所以,Alice顯然要讓它們相等,否則Alice就會虧一波。

也就是,她會讓 \(t=\frac{dp_{i-1,j}\ \ \ +\ dp_{i-1,j-1}}{2}\),因為只有這樣才可以保證 \(dp_{i-1,j}-t\)\(dp_{i-1,j-1}+t\) 相等。

邊界為 \(dp_{i,0}=0\)(一次都不加,Alice當然全選 0 )和 \(dp_{i,i}=ik\) (全加,Alice當然要拉滿)。

看起來,接下來是一個 \(\Theta(nm)\) 的 dp。

不過,我們發現,它的轉移很像一個楊輝三角!

所以,我們考慮 \(dp_{i,i}\)

\(dp_{n,m}\) 的貢獻。(因為在填充之前只有它們可以對答案造成貢獻)

\(dp_{i,j}\) 只能給 \(dp_{i+1,j}\)\(dp_{i+1,j+1}\) 作出貢獻。

所以,它需要連續將 i 進行一些 +1 ,並選擇一些來把 j 也來加夠。

然而,如果直接分析, \(dp_{i,i}\) 會給 \(dp_{i+1,i+1}\) 貢獻,然而這裡已經填好了,所以會掛。

注意到 \(dp_{i,j}\) 不能貢獻給 \(dp_{i,j+1}\) ,我們考慮從 \(dp_{i+1,i}\) 開始計算答案。

這時,向 n 需要加 \(n-i-1\) ,向 m 需要加 \(m-i\)

,而這 \(m-i\) 一共有 \(\tbinom{n-i-1}{m-i}\) 種方案,需要乘上。

而在這個過程中,它顯然會被不斷除2,一共會除 \(n-i\) 次,因為我們直接從 \(dp_{i+1,i}\) 開始轉移就意味著已經進行了一次操作。

顯然如果 m 超過規定範圍 Bob 就虧了,所以考慮用 m 來限制列舉變數。

最後的答案,就是 \(\sum\limits^m_{i=1}\tfrac{ik\ \cdot\ \tbinom{n-i-1}{m-i}}{2^{n-1}}\)

當然,如果 \(n=m\) ,前面也說過, \(dp_{i,i}\) 不應當再給它作貢獻,此時的答案是 \(km\) ,應當特判。

預處理 \(2^i\) 的逆元,複雜度 \(\Theta(n)\)

程式碼