题目描述
云浅最近学习了「单调栈」。对于一个排列 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 输入
3
1 -1 2
样例 1 输出
3
样例 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 输入
5
1 2 -1 2 1
样例 2 输出
5
样例 3 输入
6
1 2 -1 2 -1 4
样例 3 输出
22
样例 4 输入
9
1 -1 2 -1 3 3 -1 4 -1
样例 4 输出
3870
子任务约束
对于所有数据,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 |