CF1608F MEX counting 题解
题意
给定 \(n\) 和 \(k\) 和一个长度为 \(n\) 的整数序列 \(b\) 。
求有多少个长度为 \(n\) 的序列 \(a\) 满足对于任意的 \(1 \le i \le n\) 都有:
- \(0 \le a_i \le n\)
- \(|MEX(a_1,a_2,\dots,a_i)-b_i| \le k\)
其中 \(MEX(c)\) 表示 \(c\) 中没出现过的最小的非负整数。
答案对 \(998244353\) 取模
\(n \le 2000\) , \(k \le 50\)
推导
首先可以肯定的是,mex 不降,那我们分类讨论一下。
当前填的数小于大于 mex,那么mex不变。
当前填的数等于 mex,那么mex变大,但不确定到底变大多少,比方说下图。

总结一下,发现有用的只有三个值,已经填了多少个数,当前的mex是多少,有多少种比mex大的数,这里比mex大的数,我们不关心它到底为多少,只要大小关系就行,我们在最后乘上组合数即可。
转移也和上面一样分类讨论。
mex不变:
填小于 \(j\) 的数或大于 \(j\) 且属于那 \(k\) 种:\(f_{i,j,k} \to f_{i+1,j,k}\times (j+k)\)。
填大于 \(j\) 且不属于那 \(k\) 种,因为我们不关心取值,有 \(k\) 种,就有 \((k+1)\) 个间隔.
所以:\(f_{i,j,k} \to f_{i+1,j,k+1}\times (k+1)\)。
mex如果变得话,枚举他的mex跳到哪,设为 \(x\)。

可以发现,如果直接从 \(j\) 跳到 \(x\),中间就有 \(x-j-1\) 个大于 \(j\) 的数。
\(f_{i,j,k} \to f_{i+1,x,k-(x-j-1)}\)
注意到 \(x + k-(x-j-1)\) 等于 \(k+j+1\) 是定值,可以优化。
如果直接设 \(f_{i,j,k}\) 为上述三个值,空间复杂度为\(O(n^3)\),爆炸。可以发现对于第 \(i\) 个数,由于第二条限制,mex只有至多 \(2k\) 种选择,我们只取这几种即可,然后第一维可以滚掉,空间复杂度优化到 \(O(nk)\)。
代码细节很多,注意转移时 \(b_i\) 和 \(b_{i+1}\) 范围的变化。

浙公网安备 33010602011771号