Codeforces Round #853 (Div. 2) 題解

Codeforces Round #853 (Div. 2) 題解

ABCD

Codeforces Round #853 (Div. 2) | 萌新實況被吊打 | ABCD 題解

E. Serval and Music Game

分兩種情況討論:

  1. \(\lfloor\frac{s_n}{x}\rfloor=\lceil\frac{s_n}{x}\rceil\).
  2. \(\lfloor\frac{s_n}{x}\rfloor + 1=\lceil\frac{s_n}{x}\rceil\).

對於第一種,\(x\mid s_n\),即查詢 \(s_i\)\(k=\frac{s_n}{x}\) 的倍數有幾個。

顯然 \(k\mid s_n\),則當 \(k\mid s_i\) 時,顯然有 \(k\mid \gcd(s_i, s_n)\)。那麼我們可以把 \(s_i\) 扔到 \(cnt_{\gcd(s_i, s_n)}\) 上,查詢的時候我們遍歷 \(s_n\) 的因子,找出所有 \(k\mid d\mid s_n\),然後統計 \(cnt_d\)

這一步的時間複雜度是 \(O(n\log s_n + s_n)\)。(一共有 \(\sqrt {s_n}\)\(k\),遍歷因子是 \(\sqrt {s_n}\) 的)

對於第二種,設 \(k=\lfloor\frac{s_n}{x}\rfloor\),則查詢 \(s_i=pk + q(k+1)\),則 \(s_i\bmod k \le \lfloor\frac{s_i}{k}\rfloor\) 時都成立。

換個角度考慮,\(pk + q(k + 1)\) 可以表示出 \(ak + b~(b\le a)\),所有區間即爲 \([k, k + 1], [2k, 2k + 2],\dots\)

\(s_i\) 在值域上做前綴和即可 \(O(1)\) 查詢這些區間。

看起來這裏似乎有 \(\frac{s_n}{k}\) 個區間,但實際上當 \(a\ge k\) 的時候,就已經可以表示任何數了。所以只有 \(k\) 個區間。

\(k\le \sqrt {s_n}\),我們暴力計算上面那些 \(O(k)\) 個區間。

對於 \(k\ge \sqrt{s_n}\),顯然 \(ak + b\le s_n \to a\le\frac{s_n}{k}=\sqrt {s_n}\),所以區間也只有 \(O(\sqrt s_n)\) 種。

所以對於任意一個 \(k\),查詢都是 \(O(\sqrt {s_n})\) 的,一共有 \(O(\sqrt {s_n})\)\(k\),時間複雜度 \(O(s_n)\)

總時間複雜度 \(O(n\log s_n + s_n)\)

F. Serval and Brain Power

有一個限制條件是 \(k\lvert T'\rvert \le \lvert S\rvert = 80\)

我們對左邊這個式子平衡規劃。

對於 \(k< 5\) 時,顯然 \(k=2\) 包含 \(k=4\)

考慮 \(k=2\),我們暴力枚舉 \(S = S_1 + S_2\)\(O(n)\) 種拆解方式,然後做 \(\operatorname{LCS}(S_1, S_2)\)。dp 的時間複雜度是 \(O(n^2)\) 的,這裏的總時間複雜度是 \(O(n^3)\) 的。

考慮 \(k=3\),同理的,枚舉 \(S=S_1 + S_2 + S_3\)\(O(n^2)\) 種拆解方式,然後做 \(\operatorname{LCS}(S_1, S_2, S_3)\)。dp 的時間複雜度是 \(O(n^3)\) 的,總時間複雜度是 \(O(n^5)\) 的。

有一個好事是,顯然我們的拆解方式是不滿的。我們考慮這個過程的組合意義。我們把 \(n\) 個白球和 \(5\) 個黑球排成一列,求本質不同的方案數。

這裏的第 \(2\) 和第 \(4\) 個黑球是序列的拆解方案數,而 \(1, 3, 5\) 可以放在任意位置,方案數爲 \(\prod \vert S_i\vert\)

則方案數爲 \(\binom{n+5}{5} \approx 3\times10^7\),還是很穩的。

對於 \(k\ge 5\),顯然有 \(\vert T'\vert \le 16\),並且 \(T'\) 出現了 \(5\) 次以上。如果把 \(S\) 劃分爲五段長度相等的部分,則 \(T'\) 至少會完整地出現在某個段中。

於是我們對每個段,\(O(2^{16})\) 枚舉所有可能的子序列,並進行一次 \(O(n)\) 的貪心匹配。時間複雜度 \(5\times2^{16}\times 80 = 2\times10^7\),也是很穩的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章