CSP2024-16

Lu_xZ發表於2024-09-07

A

題意:互動題。\(n\) 個人,每人有一個顏色。你每次可以詢問一個集合中不同顏色數量。

最後輸出每個人的顏色,只需保證相同的相同,不同的不同。\(n \le 150\),互動次數不超過 \(3500\)

考慮在區間 \([l, r]\) 找到與 \(x\) 顏色相同的編號最小的元素。

怎麼判斷 \(x\) 有沒有在一個集合中出現過?先查詢這個集合,在查詢這個集合並上 \(x\),比對兩者是否相同。

思路很清晰了,如果在 \([l, mid]\) 出現,遞迴左區間;否則遞迴右區間。只需要區間長度對數次詢問。

對於 \(i\) 找到對應的 \(ne_i\),然後把相同顏色的一條鏈都找到。詢問次數 \(O(n\log n)\) 可以透過。submission

B

題意:

C

題意:定義長度為 \(k\) 的序列 \(A\)權值等於不同的字首最大值個數,記為 \(q(A)\)

給定一個長度為 \(n\) 的排列 \(B\),記他的一個子序列為 \(C\),求所有 \(q(C)\)\(m\) 次方之和。\(n \le 10^5, m \le 20\)

\(m\) 很小,不難想到普通冪轉下降冪:

\[\begin{aligned} \sum_{C \subseteq B} q(C)^m = \sum_{C \subseteq B} \sum_{k = 0}^m \begin{pmatrix}q(C)\\k\end{pmatrix} k! \begin{Bmatrix}m\\k\end{Bmatrix} \end{aligned} \]

其中 \(\begin{pmatrix}q(C)\\k\end{pmatrix}\) 表示所有最大值中選了 \(k\) 個的方案數。不妨先選出一個嚴格上升子序列作為最大值,再在中間填數。

\(f(i, j)\) 表示 \(1 \sim i\) 選了 \(j\) 個最大值,且恰好選了第 \(i\) 個的合法子序列個數。

\[f(i, j) = \sum_{k < i\land B_k < B_i } f(k, j - 1)\times 2^{\sum_{l = k + 1}^{i} [B_l < B_i]} \]

最後統計答案時有 \(\sum_{C}\begin{pmatrix}q(C)\\k\end{pmatrix} = \sum_{i} f(i, k) \times 2^{n - i}\),複雜度瓶頸在於 f 的轉移。

我們可以根據 j 一層一層 dp,加入 \(l\) 時將 \((B_l, n]\) 的答案乘 \(2\),即 \(l\) 只會在 \(B_i > B_l\) 時會對已經存在的 \(f(k, j - 1)\) 產生 \(2\) 的係數。

\(f(l, j - 1)\) 加到 \(B_l\) 上。其中 \([1, B_i)\) 的和恰為 \(f(i, j)\)

D

到底什麼時候開始補網路流呢?