CF1264D1 題解

liangbowen發表於2024-08-21

blog。寫一個題解區沒有的蠢做法,不依賴 dp 但是很難轉到 Hard Version(


對於已經確定的序列,深度有單調性。就是如果答案為 \(x\),那麼肯定能選出深度為 \(1\sim x\) 的子序列。

\(\operatorname{check}_s(x)\) 表示 check 序列 \(s\) 能否選出深度為 \(x\) 的子序列。考慮如何 check:

  • 發現形如 \(\texttt{((}\cdots\texttt{(())}\cdots\texttt{))}\) 的結構最優。
  • \(pre_i\) 表示 \([1,i]\)( 的數量,\(suf_i\) 表示 \([i,n]\)) 的數量,只需滿足:\(\exists\min(pre_i,suf_{i+1})\ge x\)
  • 找到序列第一個 \(pre_i=x\) 的位置,檢驗是否有 \(suf_{i+1}\ge x\) 即可。

顯然,對於確定序列有 \(\text{ans}_s=\sum\limits_{x=1}^n \operatorname{check}_s(x)\)

回到原問題,列舉 \(x=1\sim n\)權值和轉為了計數:只需計數 \(\operatorname{check}_s(x)=1\)\(s\) 數量,所有 \(x\) 的方案數加起來就行!

最後將上述 \(\operatorname{check}_s(x)\) 的過程放到計數上就行:

  • 列舉 \(i\),這個 \(i\) 需要滿足:是序列第一個 \(pre_i=x\) 的位置,且有 \(suf_{i+1}\ge x\)
  • \(s_i=\texttt{(}\),前半段在 \(\texttt{?}\) 中湊夠左括號數就行,後半段在 \(\texttt{?}\) 中湊到 \(\ge x\) 就行。有貢獻:

\[\binom{\text{字首 }\texttt{?}\text{ 的數量}}{x-\text{字首 }\texttt{(}\text{ 的數量}}\times\sum\limits_{x-\text{字尾 }\texttt{)}\text{ 的數量}}^{\text{字尾 }\texttt{?}\text{ 的數量}}\binom{\text{字尾 }\texttt{?}\text{ 的數量}}{i} \]

  • \(s_i=\texttt{(}\),前半段稍微改改就行,有貢獻

\[\binom{\text{字首 }\texttt{?}\text{ 的數量}-1}{x-\text{字首 }\texttt{(}\text{ 的數量}-1}\times\sum\limits_{x-\text{字尾 }\texttt{)}\text{ 的數量}}^{\text{字尾 }\texttt{?}\text{ 的數量}}\binom{\text{字尾 }\texttt{?}\text{ 的數量}}{i} \]

後面 Sigma 的部分可以預處理,然後列舉 \(x,i\) 後就能 \(O(1)\) 計算。

code,時間複雜度 \(O(n^2)\)