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\),也是很稳的。

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