Queue Sorting

给定长度为 \(n\) 的序列 \(A\)

若长度为 \(m = \sum\limits_{i=1}^{n} a_i\) 的序列 \(B\) 满足下列条件,则称其为好序列:

  • 对于所有 \(i \in [1,n]\)\(B\) 中恰好包含 \(a_i\)\(i\)

  • \(B\) 可以被拆分成至多两个不下降子序列。

求满足条件的序列 \(B\) 数量,对 \(998244353\) 取模。

\(1 \leq n \leq 500\)\(0 \leq a_i \leq n\)\(1 \leq m \leq 500\)


由经典结论,可知条件等价于 \(B\) 的最长下降子序列长度 \(\leq 2\)

为了方便,我们将 \(B\) 翻转,我们需要让 \(B\) 的最长上升子序列长度 \(\leq 2\)

考虑将所有数从小到大加入序列,计算当前的序列方案数。

我们容易发现,在第一个长度为 \(2\) 的最长上升子序列后,不能再加入新的数。

设当前加入了 \(1\)\(i\) 的所有数,只能在第 \(j\) 个数前加数,此时方案数为 \(d_{i,j}\)

接下来加入第 \(i+1\) 个数,有如下情况:

  • 在序列开头加数

  • 在第 \(j\) 个数前加数。

不妨设第一种情况加入了 \(x\) 个数,第二种情况在原序列的第 \(y\) 个数后开始加数。

此时 \(dp_{i,j}\) 会转移到 \(dp_{i+1,x+y+1}\),接下来考虑转移系数。

也就是说,现在我们要在 \(j-y\) 个空里填 \(a_{i+1} - x\) 个数,其中第一个空必填。

此时对应的方案数为 \(\dbinom{a_{i+1} - x + j - y - 2}{j - y - 1}\)

dp 即可,注意特判 \(x = a_{i+1}\)

posted @ 2026-01-12 20:40  Oken喵~  阅读(7)  评论(0)    收藏  举报