题解:CF2066D2 Club of Young Aircraft Builders (hard version)
一道比较神奇的计数题。
我们经过适当转化后的题意可以变为:
在一个序列
-
对于任意
i \in [1, n] ,满足a_j \geq i 的j 数量要不少于c 。 -
对于任意
i \in [1, m] ,满足a_j \geq a_i, j < i 的j 的数量要小于c 。
不难发现,条件
对于这一类问题,我们考虑直方图 DP 的类似处理方式,对于每一个
Solution for easy version(a_i = 0 )
直接考虑上面的过程,定义
-
- 枚举
k 表示满足a_p = i 的p 的数量,有:f_{i, j} \times \binom{c}{k} \rightarrow a_{i + 1,j - k} 。 - 答案是
f_{n, c} 。
时间复杂度为
Solution for hard version
考虑上面的 DP 思路能否继续使用,我们发现如果依旧使用上面的记录方式
我们能否记录一些本质相同但是和位置相关的信息呢?显然这是可以的,我们魔改一下 DP 数组,记录
-
- 定义
x 为所有已经强制填的a_p = i + 1 的数量,z 为所有p \leq j 并且已经强制填的a_p > i + 1 的数量,要求不存在强制填的a_p = i + 1, p > j ,有转移:f_{i, j} \times \binom{c - x - z}{y} \to f_{i+1, j + x + y}, y \in [0, c - x - z] 。 - 答案为
f_{n-1, m} 。
这个东西有点抽象,我大概想了 40min 才会,可以画图理解一下,时间复杂度为