题意
给定 \(n, k\) 和序列 \(b_{1\dots n}\),计数序列 \(a_{1\dots n}\) 使得 \(\forall i \in [1, n], \operatorname{mex}\limits_{j=1}^i\{a_j\}\in [b_i - k, b_i + k]\)。
数据范围:\(1\le b_i \le n \le 2000, 0\le k\le 50\)。
题解
永远做不出简单题。我是弱智。
考虑递推过程中维护 \(\operatorname{mex}\) 的变化,那么需要在每个 \(i\) 处决策 \(\operatorname{mex}\) 增加多少,那么考虑在某一个数变成小于 \(\operatorname{mex}\) 的位置再去决策它的具体值。记 \(f_{i, j, k}\) 表示前 \(i\) 个数,\(\operatorname{mex}\) 为 \(j\),有 \(k\) 个数大于当前的 \(\operatorname{mex}\) 的方案数。写一下转移:
\[f_{i, j, k} = f_{i-1, j, k-1} + (j-1)f_{i-1,j,k} + \sum\limits_{t=0}^{j-1}\sum\limits_{p}\binom{k+p}{p}{p\brace j-t-1}(j-t-1)!f_{i-1,t,k+p} \]发现状态数 \(n^2k\),转移怎么也不能做到 \(\mathrm O(1)\)。于是我就极限降智。
怎么优化呢?注意到比较恶心的是 \(p\),主要是我们虽然知道转移从 \(t\) 到 \(j\) 的过程中一定要用未决策的数去填满 \(t-j-1\) 个位置,但是不知道具体有几个数,怎么把这些数放进去。然后你发现与这边巨大多的式子形成鲜明对比的是你在把数延迟决策的时候机会什么都不干。于是你考虑改一改状态:\(g_{i,j,k}\) 表示前 \(i\) 个数,\(\operatorname{mex}\) 为 \(j\),大于当前 \(\operatorname{mex}\) 的数分为 \(k\) 类的方案数。于是转移就是:
\[g_{i, j, k} = (j + k)g_{i-1, j, k} + g_{i-1,j,k-1} + \sum\limits_{t=0}^{j-1}\binom{k + j - t - 1}{j - t - 1}(j - t - 1)!g_{i-1,t,k+j-t-1} \]这个转移随便拆一下做个前缀和就 \(\mathrm O(1)\) 了。
标签:转移,le,limits,MEX,CF1608F,sum,mex,counting,operatorname From: https://www.cnblogs.com/kyeecccccc/p/17391066.html