MX-S5 T3 官方题解

· · 题解

IMAWANOKIWA (Construction ver.)(FeOI 命题组)

可能更好的阅读体验

题意简述

给你一个初始长度为 n只包含 \mathbf{0, 1, 2} 的序列 a_{1 \sim n},你每次可以选择两个相邻的数 p, q,删去它们,并在原位置插入 \mathrm{popc}(p + q)。其中,\mathrm{popc}(x) 表示 x 在二进制表示下 1 的个数。

显然每次操作后序列长度都会减少 1,所以执行 n - 1 次操作后,这个序列会恰好剩下一个数。请你最小化剩下的这个数,并给出字典序最小的操作位置序列。

此题多测,设 T 为组数,对所有数据,满足 1 \le T \le 2001 \le n \le 10^5

算法 1

我会爆搜!

时间复杂度:\mathcal O(Tn! \times poly(n))

期望得分:12

算法 2

我会区间 DP!设 f_{i, j, k} 表示区间 [i, j] 是否能得到 k \ (0 \le k \le 2),枚举最小转移点即可。

时间复杂度:\mathcal O(Tn^3)

期望得分:24

算法 3

我会特殊性质 A!发现 a 序列中只有 1, 2 的时候 \mathrm{popc}(p + q) = ((p - 1) \oplus (q - 1)) + 1,其中 \oplus 表示异或运算。

那么无论操作顺序答案都是一样的,答案也可以直接求出,最小字典序直接操作 n - 1 次开头即可。

时间复杂度:\mathcal O(Tn)

期望得分:12,结合区间 DP 后 36

算法 4

我会判断答案!首先给出结论:

证明

前两个情况是显然的。先证明第三种情况的对应形式无法合成 1,可以发现如果 0 不参与操作只是相当于减少了一个 1,还是该形式;而 0 若参与操作,序列 a 就会变为第二种情况,并且只有奇数个 2,显然答案为 2。所以该情况一定只能合成 2

再证明非对应形式一定可以合成。考虑归纳,如果我们能找到一个 0,然后将其左右两边合成,只要左右两边不都是 2,最终就可以合出 1

假设 0 的个数大于两个,那么选择最左边的 0 即可,右边至少有两个 0,一定可以得到 1

假设 0 的个数恰好有两个,那么序列 a 一定是 A0B0C 的形式,其中 A, B 都是不存在 0 的序列。如果 B[2],那么先将 B 和旁边一个 0 合成即可得到 A01C 的形式,该形式答案一定为 1;否则左右两个 0 肯定有一个合法。

假设 0 的个数只有一个。如果 0 两边至少有一个不是 2,那么我们就有操作空间了:当 2 有奇数个时,我们让最靠近 02 把经过的 1 都干掉,与 0 合并。否则我们直接让 0 与它旁边的那个 1 合并。假设这个 0 的左右两边都不合法,那么一定有一边至少有三个 2,我们把最靠近 0 的两个 2 合并,0 两边就至少有一个 1;否则可以直接合出 1

这样所有情况都被考虑到了,证毕。

时间复杂度:\mathcal O(Tn)

期望得分:25,结合前面算法后 52

算法 5

考虑直接贪心,从前往后依次尝试合并,每次合并完之后重新扫一遍序列,判断答案是否变大,如果变大了就撤销这个操作。

这样时间复杂度看似是 \mathcal O(Tn^3) 的,实际上是 \mathcal O(Tn^2) 的。感性理解一下,第一个可以合并的位置出现的一般不会太晚,实际上第一个可以合并的位置最多不会超过 3。证明还是需要分讨,这里就不放了。

时间复杂度:\mathcal O(Tn^2)

期望得分:36,结合前面算法后 61

算法 6

使用平衡树一类的数据结构维护序列,每次快速找出下一个能操作的位置,或者直接暴力枚举位置。

时间复杂度:\mathcal O(Tn \log n)

期望得分:视实现有 48 \sim 92,结合前面算法后 70 \sim 94

算法 7

根据前面的结论,可以直接暴力维护前几个位置,后面的位置一定是连续的,这样就可以省掉 \log

时间复杂度:\mathcal O(Tn)

期望得分:100