题意:对于一个长度为 的排列 ,容易对每个 计算出 ,满足 。
现在给出 ,求满足条件的排列数。答案对 取模。
多组数据,,,时限 。
不难发现 是 前面第一个比 小的位置, 是 后面第一个比 小的位置。
不妨称 为
的管辖区间。(可以发现,管辖区间就是该序列建立笛卡尔树后的 dfs
序区间)
最小值 的管辖区间为 。然其余元素的区间都不可能跨过 ,整个序列被分成了两个部分。
可以把
划分到两个子问题中去,方案数是组合数。
具体实现:
设
为区间内安排排列的方案数。
寻找管辖区间为 的元素
,若找不到,返回 。
若能找到,则 寻找
可以预先排序+二分,若使用 std::map
会
TLE
。
读入量较大,注意使用快读。
复杂度 。