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

题意简述

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

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

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

算法 1

我会爆搜!

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

期望得分:1212

算法 2

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

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

期望得分:2424

算法 3

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

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

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

期望得分:1212,结合区间 DP 后 3636

算法 4

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

  • 当且仅当 aa 序列全为 00 时答案为 00
  • 序列 aa 没有 00 时答案为 22 的个数对 22 取模的余数 +1+1
  • 否则,当且仅当在序列 aa 为“一段 112,0,22, 0, 2,一段 11”(左右两边的一段 11 都可以为空)的形式时,答案为 22,其余情况为 11

证明

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

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

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

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

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

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


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

期望得分:2525,结合前面算法后 5252

算法 5

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

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

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

期望得分:3636,结合前面算法后 6161

算法 6

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

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

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

算法 7

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

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

期望得分:100100