题解:CF1989E Distance to Different
先考虑 \(k=2\) 的情况
整个 \(a\) 数组只有两种数,我们考虑每个相同数的连续段对应的 \(b\) 数组长什么样。
不难发现,如果这个连续段的首或尾不是 \(a\) 数组边界的话,那么中间的分布一定是 \(1,2,...,x/2,x/2(或x/2-1),...,2,1\) 也就是一个连续段。对应的 \(b\) 数组的这一段只和这一段的长度有关,与具体填的是哪个数字是没有关系的。
所以,现在只需要一段一段地从左到右进行划分即可,相邻两段填的数字不相同。对于 \(k=2\) 时,只需
要关注分段点的位置即可。
注意到长度为 \(2\) 的段,其对应的 \(b\) 数组是 \(1,1\),等价于两个相邻的不同的数,所以我们在进行上述划分
时需要注意段长不应该为 \(2\)。
\(k=2\) 的分析帮助我们对这道题有一个大致的启发了。
为了满足每个 \(1\) 到 \(k\) 的整数都至少出现一次这个限制,每次遇到 \(b_i = 1\) 时,我们都尽量填还没出现的那个整数,这样可以尽快满足这个限制。
考虑动态规划。设 \(dp(i,j)\) 表示当前从左到右填到第 \(i\) 个位置,已经填了 \(j\) 种数对应的 \(b\) 数组种类数。
那么我们仍然考虑分段,\(dp\) 方程如下:
\[dp(i, \min ( j + 1,k))=
\left\{
\sum_{p = 1}^{i-1} \ dp(i-p,j)
\right\}
- dp( i-2 , j )
\]
之所以要减掉 \(dp( i-2 , j )\),是因为分段的时候的长度不能为 \(2\)。另外注意这个 \(dp\) 方程在 \(i=1\) 和 \(i=n\) 时要特判一下,因为此时是可以拼接一个长度为 \(2\) 的段的。
时间复杂度:$ O(n^2k)$
会 T 怎么办?用前缀和进行优化即可。
时间复杂度:\(O(nk)\)

浙公网安备 33010602011771号