QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: jiangly

Posted at: 2025-12-14 07:27:39

Last updated: 2025-12-14 07:27:45

Back to Problem

题解

最后的序列的每个数都是由原序列的一个区间操作得来的。我们可以猜想,当一个序列长度大于一定值(且是奇数),则能够通过操作得到 $[0,3]$ 中的每种数。事实上这个阈值是 $K=17$。

有了上述结论之后,我们就可以 DP 了。设 $f_{i,j}$ 表示让前 $i$ 个数递增,结尾是 $j$,最少的操作次数。转移时只需要枚举结尾的区间,这个区间长度只需要枚举到 $K$ 即可。转移需要一个辅助数组 $g_{l,r,x}$,表示 $[l,r]$ 能否得到 $x$,其中 $r-l\le K$。由于这个辅助数组的转移需要枚举两个分界点,所以复杂度达到了 $O(nK^3)$。我们再用一个辅助数组表示一个长度为偶数的区间分成两段,能得到哪些数的 pair,可以将复杂度优化到 $O(nK^2)$,但是有巨大的常数。为了优化复杂度,我们把辅助数组的值压位用二进制数表示,然后预处理合并的结果,就能去掉这个巨大的常数。

最后还要注意序列末尾有一段不操作的情况。

时间复杂度 $O(nK^2)$。

Comments

No comments yet.