P14364 [CSP-S 2025] 员工招聘 / employ

先来设计 dp 状态。我们至少需要求出 \(f(i,j)\) 表示前 \(i\) 个位置填了 \(j\) 个不合法的人的方案数。但这样显然是没有办法转移的,发现问题关键在于不知道到这里时剩下没有填的人有多少 \(c<j\),所以不知道有没有。所以我们设 \(f(i,j,k)\) 表示前 \(i\) 个人,有 \(j\) 个人不合法,其中挂掉的里面 \(c>j\) 的还有 \(k\) 个人,即有 \(i-k\) 个刮掉的人 \(c\leq j\)。这里发现还是不好转移,但是我们可以发现一旦遇到了某些 \(j+1\) 的情况原先的所有放进去等于 \(j\) 的都可以转移了。这就是贡献延迟。

那么我们考虑设 \(a_x=\sum [c_i=x],b_x=\sum_{i=1}^x a_i\)

\(s_{i+1}=1\) 时。如果 \(c_{i+1}>j\),那么没有人挂掉,无法计算,所以只能向后转移:

\[f(i,j,k)\rightarrow f(i+1,j,k+1) \]

\(s_{i+1}=1,c_{i+1}\leq j\) 时,则会挂掉, \(j+1,k+1\)。我们考虑确定哪些在之前加入 \(c_x=j+1\) 的人。枚举个数 \(l\),则有:

\[f(i,j,k)(b_j-i+k)\binom{a_{j+1}}{l}\binom{k}{l}l!\rightarrow f(i+1,j+1,k-l) \]

\(s_i=0,c_{i+1}>j+1\) 时,无论谁都会挂,有转移:

\[f(i,j,k)\binom{a_{j+1}}{l}\binom{k}{l}l!\rightarrow f(i+1,j+1,k+1-l) \]

\(s_i=0,c_{i+1}\leq j+1\),有:

\[f(i,j,k)(b_{j+1}-i+k-l)\binom{a_{j+1}}{l}\binom{k}{l}l!\rightarrow f(i+1,j+1,k-l) \]

答案即为

\[\sum_{i=0}^{n-m}f(n,i,n-b_i)(n-b_i)! \]

posted @ 2025-11-11 16:54  tanghg  阅读(14)  评论(0)    收藏  举报