1. 程式人生 > 其它 >CF1264D(組合數)

CF1264D(組合數)

把雲剪貼簿裡的東西發出來順便複習一下


考慮如何貪心確定一個序列的深度?

可以考慮最左邊的左括號,最右邊的有括號匹配,然後扔掉匹配的兩個括號後繼續做,這樣是最大的。

考慮一對括號如何會產生貢獻?

手玩一下能發現,當 \((i,j)\)\(i\) 的左邊左括號數 = \(j\) 右邊右括號數,且 s[i]=='(' , s[j]==')' ,就會有貢獻。

但是要列舉兩個,比較不可做,如何簡化問題?

考慮換個列舉,貢獻只算在右括號上,設 s[i]=='(' 。那麼 \(i\) 右邊的 )\(i\) 左邊的 ( 嚴格少, \(i\) 就一定會被匹配一次。

\(i\) 左邊的 (\(A\)

個,?\(C\) 個;設右邊的 )\(B\) 個,?\(D\) 個。

\(i\) 的貢獻為:

\[\sum_{x=1}^C \sum_{y=1}^D \binom{C}{x}\binom{D}{y} [x+A>y+B] \]

這個 \(x+A>y+B\) 相當於 \(x-y>B-A\) ,減法沒法化簡,但是可以轉化成加法:

\[\sum_{x=1}^C \sum_{y=1}^D \binom{C}{C-x}\binom{D}{y} [x+A>y+B] \]

\(x\) 替換 \(C-x\)

\[\sum_{x=1}^C \sum_{y=1}^D \binom{C}{x}\binom{D}{y} [C-x+A>y+B] \]\[\sum_{x=1}^C \sum_{y=1}^D \binom{C}{x}\binom{D}{y} [x+y\le A+C-B-1] \]\[\sum_{k=0}^{A+C-B-1} \sum_{x=1}^C \sum_{y=1}^D \binom{C}{x}\binom{D}{y}[x+y=k] \]

後面柿子成為了範德蒙德卷積,直接替換掉兩個迴圈:

\[\sum_{k=0}^{A+C-B-1} \binom{C+D}{k} \]

由於列舉的 \(i\) 只能為 ) 或 ? ,因此 \(C+D\) 只有兩種可能取值。

然後處理兩個組合數字首和就能算了。

$$\Huge \text{Goodbye OI}$$