FJOI2016 建筑师

FJOI2016 建筑师 [* easy]

给定 \(n,A,B\) 求有多少个长度为 \(n\) 的排列满足从左看单调栈大小为 \(A\),从右看为 \(B\)

多次查询。

\(n\le 5\cdot 10^4,T\le 2\cdot 10^5,A,B\le 100\)

Solution

\(\mathcal O(Tn+n^2)\) 的容易的,考虑枚举最大值位于 \(i\) 处,那么前面就是 \(i-1\) 的序列 \(A\) 个段的方案数,后面就是 \(n-i\) 的序列 \(B\) 个段的方案数。(给 \(A,B\) 先分别减 \(1\)

然后序列计数可以直接 dp,不难注意到答案就是第一类斯特林数,这是因为可以考虑将元素分组,那么最大值显然在最开头(相当于强行规定了顺序,但其余任意排),然后将最大值从小到大排序可以认为是无序,即将 \(i\) 个元素分成 \(A\) 个圆排列的方案数。

所以不难注意到答案为:

\[\sum \binom{n-1}{i-1}\begin{bmatrix}i-1\\A\end{bmatrix} \begin{bmatrix}n-i\\B\end{bmatrix} \]

方便起见,\(i\leftarrow i-1,n\leftarrow n-1\),答案即:

\[\sum \binom{n}{i}\begin{bmatrix}i\\A\end{bmatrix} \begin{bmatrix}n-i\\B\end{bmatrix} \]

不难发现等价于 \(\binom{A+B}{A}\begin{bmatrix}n\\A+B\end{bmatrix}\),即将 \(n\) 个元素分成 \(A+B\) 个圆排列,再从其中 \(A+B\) 选出 \(A\) 个圆排列分给第一组的方案数。

于是复杂度 \(\mathcal O(nA+T)\)

posted @ 2020-10-21 21:12  Soulist  阅读(66)  评论(0编辑  收藏  举报