CF1608F MEX counting - Solution
strcmp
·
·
题解
从这题出发,我决定用一个比较基础的视角来看贡献延迟计算。
首先贡献是一个比较抽象的东西,你可以理解为我们把要算的东西拆成了很多个部分,每个部分之间它们的关系就是贡献。
贡献延迟计算就是考虑到,我们确定了当前位置的值,可能当下并没有影响,但是往后跟它取值相同的那些点,贡献又跟它不同了。这时候我们几乎不可能简单地算出来我们要求的东西。
我们的问题在于哪呢?因为前面有可能选择了当前取值的点,已经计算了它们的贡献,接下来还想继续算的话,我们可能不得不考虑已经选了那些当前取值的点,复杂度指数。
问题就在于前面这些“当前取值”的点贡献计算太早了,让它们在情况变化的时候赶不上变化。
为时尚早,面包机。
这类问题有一种非常鲜明的特征:对于取值相同的点,它们前后不同的状态总体上有二界性。
--
我认为做到这题的人,应该很多人是被 CSP-S2025 T4 引流过来的:
典型的,比如 CSP2025 employ 这道题,我们确定了选了 i 个,其中拒绝了 j 个人,问题就在于,我们并不知道其余没选的 c 中到底还有多少,是 i 以后还能产生贡献的,我们似乎一定要记录具体的 c 的状态,这样一定爆炸。
但是你仔细分析性质,就会发现我们决策 i 拒绝还是不拒绝,也就是 j \to j \text{ or } j + 1 这个过程。那些 c < j + 1 的点,我们早知道往后它们都会跑路。c > j + 1 的点,j \to j + 1 它们的影响改变的时刻还未到来。现在决策 i,可能会导致贡献改变的都是那些 c = j + 1 的点,它们从可以录用也可以拒绝,变成了遇上就会跑路。那么之前我们填的 c = j + 1 的数,为什么我们这么前面就要填它们呢,为什么不到现在再来填呢?!我们就直接假设前面已经填的 c = j + 1 的位置全部都是未知的,不考虑它们贡献的,那么我们面前就是一个旷野啊!
这样我们为了分开 i 前后 c = j + 1 的位置的贡献,只需多记录一个已用了 k 个 > j 的位置。前面 i 个位置,我们枚举 t 个 c = j + 1 的,贡献是桶的组合数和关于 t 的排列数,再乘上 i 位置满足我们决策的选取方案,清晰明了简单极了!
如果你要一个形象的比喻:
再来想想这道题,我们要让前缀 \text{mex} 序列的每个元素跟 b 的距离 \le k。
最经典的,我们令 f_{i,\,j} 代表前 i 个数 \text{mex} 是 j 的方案数。
令前缀的 \text{mex} = j,那么我们前缀已经考虑到的数的集合,真的是两眼一黑啥情况都不知道,我们随便在 i 填一个数,都可能会导致 \text{mex} 的剧烈变化,这怎么可能做得了呢!
既然大于 j 的,我们知道在 i 以前,它们除了当个占位符没任何用处,那之前我们连它们当占位符的贡献都懒得考虑。
那么为了在情况变化的时候算贡献,有什么信息是需要额外记录的呢?当然是像上面那题一一样,记录前 i 个数有多少种大于 j 的数被用过(如果你记录位置数也能做,但是你会得到一个极难继续优化的形式)。
先来考虑 $\text{mex}$ 不变的贡献,$\text{mex}$ 不变当且仅当 $a_i \ne j$,这当然是普及组难度:
填入的数小于 $j$:在小于 $j$ 的数中选取一个,$f_{i,\,j,\,k} \gets f_{i - 1,\,j,\,k} \times j$。
填入的数大于 $j$:1. 填入的数在 $k$ 个数中,同上 $f_{i,\,j,\,k} \gets f_{i - 1,\,j,\,k} \times k$。2. 不在,这时候当然不用考虑,$f_{i,\,j,\,k} \gets f_{i - 1,\,j,\,k - 1}$。
现在考虑填入的数是 $j$,我们的 $\text{mex}$ 是 $j$,要变成 $t$,那么:
- 前面 $[j + 1,\,t - 1]$ 都要出现过,有顺序的填入到 $k$ 个空中,要求所有空都被填上(为什么是 $k$ 个空,因为我们已经考虑完了颜色可重集关系,现在只需要考虑将每个颜色填好)。不难发现这是经典插板法。
我们有:
$$
f_{i,\,t,\,k} \gets \sum_{j < t} A^{t - j - 1}_{k + (t - j - 1)}f_{i - 1,\,j,\,k + (t - j - 1)}
$$
答案计算也是乘类似的排列数,比较简单。
只保留有效状态复杂度是 $\Theta(n^2k^2)$ 的。
想办法优化一下复杂度,其实可以直接做了但边界上很麻烦,我们变形一下,令 $c \gets k + t - 1$。
$$
\begin{aligned}
& f_{i,\,t,\,k} \gets \sum_{j < t} A^{t - j - 1}_{k + (t - j - 1)}f_{i - 1,\,j,\,k + (t - j - 1)}\\
& f_{i,\,t,\,k} \gets \sum_{j < t} \dfrac{(c - j)!}{j!}f_{i - 1,\,j,\,c - j}\\
\end{aligned}
$$
把 $\dfrac{1}{j!}$ 提出去然后维护前缀和即可,复杂度 $\Theta(n^2k)$。