AtCoder Beginner Contest 424 & 425 部分题解
ABC424E
- 注意到,若两根木棍长度相同,那么它们被操作的顺序也是相邻的。于是,若两根木棍“来源”相同,那么它们始终在同一“批次”中被操作。例如:\([1] \to [1\mathop{/}2, 1\mathop{/}2] \to [1\mathop{/}4, 1\mathop{/}4, 1\mathop{/}2] \to [1\mathop{/}4, 1\mathop{/}4, 1\mathop{/}4, 1\mathop{/}4]\)。
- 这启发我们,可以用 pq 维护 \((l, c)\),其中 \(l\) 为长度,\(c\) 表示长度为 \(l\) 的木棍共有 \(c\) 根。
ABC424F
- 首先断环为链,发现每根弦可以被看成一个区间 \([a, b]\)。
- 注意到,加入 \([a, b]\) 的充要条件是其不与其他区间形成相交关系,并且对于已经被加入了的区间,它们要么不交要么一个包含另一个。
- 这种“要么不交要么一个包含另一个”的结构和合法括号串是等价的(即将区间左端点记为 \(\texttt (\),右端点记为 \(\texttt )\)),而括号串合法的充要条件是,令 \(1 := \texttt (, -1 := \texttt )\),则这个 \(\pm 1\) 序列的和为 \(0\) 且每一个前缀和都不小于 \(0\)。
- 线段树维护 \((s, m)\),\(s\) 表示和,\(m\) 表示前缀和的最小值。
ABC424G
- 暴力怎么做。暴力是不是,先枚举唱哪些歌,再判断这个选法行不行,如果行就用对应的 \(\sum c\) 更新答案。
- 那怎么判断选法行不行?一个直观的想法是,\(b\) 值小的歌在安排人时会更不受限,所以我们先安排 \(b\) 更大的歌。设要唱的歌为 \(j_1, j_2, \ldots j_k\),满足 \(b_{j_1} \ge b_{j_2} \ge \cdots \ge b_{j_k}\)。
- 然后直接做似乎不好做,但是注意到一个必要条件:对于 \(p = 1, 2, \ldots, k\),成立 \(\sum_{i=1}^n \min\{a_i, p\} \ge \sum_{i=1}^p b_{j_i}\),翻译一下就是前 \(p\) 首歌需要的总人次至少是每个人最多能跳的次数(即 \(\min\{a_i, p\}\))的和。
- 我们将在最后证明这也是充分条件。
- 于是这个题被转化为:选择若干首歌 \(b_{j_1} \ge b_{j_2} \ge \cdots \ge b_{j_k}\),使得对所有 \(p = 1, 2, \ldots, k\),成立 \(\sum_{i=1}^n \min\{a_i, p\} \ge \sum_{i=1}^p b_{j_i}\),并最大化 \(c_{j_1} + c_{j_2} + \cdots + c_{j_k}\)。我们先将 \((b, c)\) 按 \(b\) 从大到小排序。
- 这个可以 dp。设 \(f(i, k, s)\) 表示考虑前 \(i\) 首歌,选了 \(k\) 首,其 \(\sum b\) 为 \(s\) 时,最大的 \(\sum c\)。记 \(S_p := \sum_{i=1}^n \min\{a_i, p\}\),则有:
- \(f(i + 1, k, s) \gets f(i, k, s)\)(考虑不选第 \(i + 1\) 首歌)。
- \(f(i + 1, k + 1, s + b_{i+1}) \gets f(i, k, s) + c_{i+1}\)(考虑选第 \(i + 1\) 首歌,当 \(S_{k+1} \ge s + b_{i+1}\) 时该转移方程成立)。
- 初值为 \(f(0, 0, 0) = 0\),其它均为 \(-\infin\)。
下面我们来证明:对于一个选歌方案 \(\{j_1, j_2, \ldots, j_k\}\),满足 \(b_{j_1} \ge b_{j_2} \ge \cdots \ge b_{j_k}\),其可行当且仅当对所有 \(p = 1, 2, \ldots, k\),成立 \(\sum_{i=1}^n \min\{a_i, p\} \ge \sum_{i=1}^p b_{j_i}\)。
必要性已证,下面证充分性。对 \(k\) 用归纳法。\(k = 1\) 时有 \(\sum_{i=1}^n \min\{a_i, 1\} \ge b_{j_1}\),显然可行。
假设结论对 \(k\) 成立,现考虑 \(k + 1\)。我们考虑第 \(j_1\) 首歌。设唱完它后第 \(i\) 个人的剩余可用次数为 \(a'_i\),则恰有 \(b_{j_1}\) 个 \(i\) 使得 \(a_i - a'_i = 1\),而其余的 \(i\) 满足 \(a_i - a'_i = 0\),故 \(a_i \ge a'_i \ge a_i - 1\)。则对于 \(p = 1, 2, \ldots, k\),有
我们令前 \(b_{j_1}\) 大的 \(a_i\) 满足 \(a'_i := a_i - 1\)。注意到,当所有满足 \(a'_i = a_i\) 的项均满足 \(p \ge a'_i = a_i\) 时,它们都成立 \(\min\{a_i, p + 1\} = \min\{a'_i, p\}\),故满足 \(\min\{a'_i, p\} = \min\{a_i, p + 1\} - 1\) 的至多只有那些满足 \(a'_i = a_i - 1\) 的项,共 \(b_{j_1}\) 个。于是有
而当所有满足 \(a'_i = a_i\) 的项存在 \(a'_i = a_i > p\) 时,那些满足 \(a'_j = a_j - 1\) 的项一定满足 \(a'_j = a_j - 1 \ge a_i - 1 \ge p\)(由于 \(a_j \ge a_i\)),这样就有至少 \(b_{j_1}\) 个 \(a_i\) 满足 \(\min\{a'_i, p\} = p\),故
无论何种情况,由归纳假设,均有一种方案使得可以唱完 \(j_2, j_3, \ldots, j_{k+1}\) 这 \(k\) 首歌。于是,存在一种方案使得我们可以唱完 \(j_1, j_2, \ldots, j_{k+1}\) 这 \(k + 1\) 首歌。\(\square\)
ABC425E
- 显然答案就是 \((\sum c_i)! \mathop{/} (\prod c_i!)\)。
- 但是 \(M\) 可以不是质数,那么我们对于每个 \(a!\)(\(a = 1, 2, \ldots, 5\,000\))记录一下 \(a!\) 的质因数分解即可。
ABC425F
- 状压。但是我们发现问题在于去重。
- 常见的想法是对于多个“等效”的插入操作,钦定只能选位置最靠左的。那么怎么处理“等效”操作?怎么知道哪个是位置最靠左的?
- 可以将所有对应子序列相同的状态缩成一个状态,但是这样常数太大。
- 但是我们可以将本题的“插入”操作等价为“删除”操作,这样我们就可以直接知道哪个删除操作是所有等效操作中位置最靠左的了。
ABC425G
- 里层是 \(a(x) := \min_{i=1}^n \{a_i \oplus x\}\),这个结构可以用 trie 处理。
- 外层是 \(\sum_{x=0}^{M-1} a(x)\),很自然地想到,应当对每个二进制位按照 \(0\) 和 \(1\) 分类处理。
- 那么这两条加起来就是 trie + 数位 dp。
- 于是设 \(f(v, k, 0/1)\) 表示当前位于 trie 上的 \(v\) 结点,当前正考虑到从低到高第 \(k\) 个二进制位,否/是顶着上限时的 \(\sum_{x \in S(v)} a(x)\),\(S(v)\) 表示 \(v\) 结点对应的形如 \([2^k, 2^{k+1}) \cap [0, M)\) 的区间。转移时考虑左右子树是否为空分类讨论。

浙公网安备 33010602011771号