#YDRS003D. 仿佛看到了流星飞上天空
仿佛看到了流星飞上天空
题目描述
云浅最近学习了「单调栈」。对于一个排列 ,我们可以这样求出其「单调栈」:
- 维护一个栈 ,初始为空。
- 依次考虑每个 :
- 若当前 非空且 栈顶的值大于 ,则将栈顶弹出;重复此过程直到 为空或 的栈顶元素小于 。
- 最后将 压入栈。
现在 Yoimiya 有一个排列 ,云浅用排列 执行了上述过程。不幸的是,云浅不小心弄丢了排列 ,好在对于某些位置 ,云浅记录下了 表示在依次将 插入到栈中时,单调栈中的元素个数。
Yoimiya 想让你算出,有多少个排列 符合云浅记录下来的这些条件。答案对 取模。
输入格式
第一行一个正整数 表示排列的长度。
第二行 个整数 ,对于每个 :
- 若 ,代表将 依次插入栈中后,单调栈的大小为 。
- 若 ,则代表云浅没有记录这个位置的单调栈大小。
输出格式
输出一行一个非负整数表示答案。
样例 输入
3
1 -1 2
样例 输出
3
样例 解释
有三种符合条件的排列:。
以 为例,其每个前缀的单调栈分别为 ,大小分别为 。
样例 输入
5
1 2 -1 2 1
样例 输出
5
样例 输入
6
1 2 -1 2 -1 4
样例 输出
22
样例 输入
9
1 -1 2 -1 3 3 -1 4 -1
样例 输出
3870
子任务约束
对于所有数据,。
子任务编号 | 特殊性质 | 分值 | 依赖子任务 | |
---|---|---|---|---|
Subtask #1 | 无 | 无 | ||
Subtask #2 | ||||
Subtask #3 | 无 | |||
Subtask #4 | 无 | |||
Subtask #5 | ||||
Subtask #6 | 无 | |||
Subtask #7 |
相关
在下列比赛中: