FJOI2016 建筑师

FJOI2016 建筑师 [* easy]

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

多次查询。

(nle 5cdot 10^4,Tle 2cdot 10^5,A,Ble 100)

Solution

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

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

所以不难注意到答案为:

[sum inom{n-1}{i-1}egin{bmatrix}i-1\Aend{bmatrix} egin{bmatrix}n-i\Bend{bmatrix} ]

方便起见,(ileftarrow i-1,nleftarrow n-1),答案即:

[sum inom{n}{i}egin{bmatrix}i\Aend{bmatrix} egin{bmatrix}n-i\Bend{bmatrix} ]

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

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

原文地址:https://www.cnblogs.com/Soulist/p/13854770.html