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{pmatrix}q(C)\\k\end{pmatrix}\) 表示所有最大值中選了 \(k\) 個的方案數。不妨先選出一個嚴格上升子序列作為最大值,再在中間填數。
設 \(f(i, j)\) 表示 \(1 \sim i\) 選了 \(j\) 個最大值,且恰好選了第 \(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
到底什麼時候開始補網路流呢?