#YDRS003D. 仿佛看到了流星飞上天空

仿佛看到了流星飞上天空

题目描述

云浅最近学习了「单调栈」。对于一个排列 bb,我们可以这样求出其「单调栈」SS

  • 维护一个栈 SS,初始为空。
  • 依次考虑每个 i=1,2,,ni=1,2,\cdots,n
  • 若当前 SS 非空且 SS 栈顶的值大于 bib_i,则将栈顶弹出;重复此过程直到 SS 为空或 SS 的栈顶元素小于 bib_i
  • 最后将 bib_i 压入栈。

现在 Yoimiya 有一个排列 pp,云浅用排列 pp 执行了上述过程。不幸的是,云浅不小心弄丢了排列 pp,好在对于某些位置 ii,云浅记录下了 aia_i 表示在依次将 p1,p2,,pip_1,p_2,\cdots,p_i 插入到栈中时,单调栈中的元素个数。

Yoimiya 想让你算出,有多少个排列 pp 符合云浅记录下来的这些条件。答案对 998244353998244353 取模。

输入格式

第一行一个正整数 nn 表示排列的长度。

第二行 nn 个整数 a1,a2,,ana_1,a_2,\cdots,a_n,对于每个 aia_i

  • 1ain1\le a_i\le n,代表将 p1,p2,,pip_1,p_2,\cdots,p_i 依次插入栈中后,单调栈的大小为 aia_i
  • ai=1a_i=-1,则代表云浅没有记录这个位置的单调栈大小。

输出格式

输出一行一个非负整数表示答案。

样例 11 输入

3
1 -1 2

样例 11 输出

3

样例 11 解释

有三种符合条件的排列:p=(1,3,2),p=(2,1,3),p=(3,1,2)p=(1,3,2),p=(2,1,3),p=(3,1,2)

p=(1,3,2)p=(1,3,2) 为例,其每个前缀的单调栈分别为 {1},{1,3},{1,2}\{1\},\{1,3\},\{1,2\},大小分别为 1,2,21,2,2

样例 22 输入

5
1 2 -1 2 1

样例 22 输出

5

样例 33 输入

6
1 2 -1 2 -1 4

样例 33 输出

22

样例 44 输入

9
1 -1 2 -1 3 3 -1 4 -1

样例 44 输出

3870

子任务约束

对于所有数据,1n150,ai{1,1,2,,n}1\le n\le 150,a_i\in\{-1,1,2,\cdots,n\}

子任务编号 nn\le 特殊性质 分值 依赖子任务
Subtask #1 88 1111
Subtask #2 1414 1212 11
Subtask #3 4040 ai1a_i\neq -1
Subtask #4 1010 2,32,3
Subtask #5 100100 ai1a_i\neq -1 1818 33
Subtask #6 2222 4,54,5
Subtask #7 150150 1515 66