题目描述
云浅最近学习了「单调栈」。对于一个排列 b,我们可以这样求出其「单调栈」S:
- 维护一个栈 S,初始为空。
- 依次考虑每个 i=1,2,⋯,n:
- 若当前 S 非空且 S 栈顶的值大于 bi,则将栈顶弹出;重复此过程直到 S 为空或 S 的栈顶元素小于 bi。
- 最后将 bi 压入栈。
现在 Yoimiya 有一个排列 p,云浅用排列 p 执行了上述过程。不幸的是,云浅不小心弄丢了排列 p,好在对于某些位置 i,云浅记录下了 ai 表示在依次将 p1,p2,⋯,pi 插入到栈中时,单调栈中的元素个数。
Yoimiya 想让你算出,有多少个排列 p 符合云浅记录下来的这些条件。答案对 998244353 取模。
输入格式
第一行一个正整数 n 表示排列的长度。
第二行 n 个整数 a1,a2,⋯,an,对于每个 ai:
- 若 1≤ai≤n,代表将 p1,p2,⋯,pi 依次插入栈中后,单调栈的大小为 ai。
- 若 ai=−1,则代表云浅没有记录这个位置的单调栈大小。
输出格式
输出一行一个非负整数表示答案。
样例 1 输入
样例 1 输出
样例 1 解释
有三种符合条件的排列:p=(1,3,2),p=(2,1,3),p=(3,1,2)。
以 p=(1,3,2) 为例,其每个前缀的单调栈分别为 {1},{1,3},{1,2},大小分别为 1,2,2。
样例 2 输入
样例 2 输出
样例 3 输入
样例 3 输出
样例 4 输入
样例 4 输出
子任务约束
对于所有数据,1≤n≤150,ai∈{−1,1,2,⋯,n}。
子任务编号 |
n≤ |
特殊性质 |
分值 |
依赖子任务 |
Subtask #1 |
8 |
无 |
11 |
无 |
Subtask #2 |
14 |
12 |
1 |
Subtask #3 |
40 |
ai=−1 |
无 |
Subtask #4 |
无 |
10 |
2,3 |
Subtask #5 |
100 |
ai=−1 |
18 |
3 |
Subtask #6 |
无 |
22 |
4,5 |
Subtask #7 |
150 |
15 |
6 |