51Nod1934 受限制的排列

题意:对于一个长度为 的排列 ,容易对每个 计算出 ,满足

现在给出 ,求满足条件的排列数。答案对 取模。

多组数据,,时限


不难发现 前面第一个比 小的位置, 后面第一个比 小的位置。

不妨称 的管辖区间。(可以发现,管辖区间就是该序列建立笛卡尔树后的 dfs 序区间)

最小值 的管辖区间为 。然其余元素的区间都不可能跨过 ,整个序列被分成了两个部分。

可以把 划分到两个子问题中去,方案数是组合数。


具体实现:

为区间内安排排列的方案数。

寻找管辖区间为 的元素 ,若找不到,返回

若能找到,则 寻找 可以预先排序+二分,若使用 std::mapTLE

读入量较大,注意使用快读。

复杂度