P7132 小 L 的零食
题目背景
小 L 很喜欢吃零食。
题目描述
**提交时自动开启 O2 优化**。
小 L 现在想把一些零食放在一个盒子里。但是零食没放稳就会摔坏,所以小 L 希望求出**有多少种稳定的堆放零食的方法**。
零食都可以抽象成一个 $1\times1$ 的正方形,而盒子的底部可以看成长度为 $n$ 的一维线段。准确地说,零食被分为 $n$ 堆,从左到右地放在盒子里面,依次记为第 $1,2,\ldots,n$ 堆。我们认为每一堆的高度 $h_i$ 是这一堆零食的数量,且任意一堆都可以不包含任何零食。
我们定义第 $i$ 堆零食是稳定的,当且仅当:
- $h_i\le m$,即这一堆零食高度不超过 $m$。
- 在满足上一条的同时,满足以下两条之一或同时满足:
- $i=1$ 或 $i=n$,此时有一侧是盒子内壁所以这一堆不会倒下;
- $\color{red}\max\{h_{i-1},h_{i+1}\}\ge h_i-d_i$,此时它两侧的两堆零食有一堆足够高可以支撑这一堆不倒下。
我们定义一种稳定的堆放零食的方法,是一个长度为 $n$ 的 $h_i$ 的序列,满足按这个序列堆放出来的零食每一堆都是稳定的。
显然盒子里最多放下 $n\times m$ 个零食,我们认为小 L 的零食数量不少于 $n\times m$,并且不必将所有零食全部放进盒子。额外地,我们认为**每一个零食都是完全一样的**。
输入格式
总共包括 $2$ 行。
第一行包含两个正整数 $n,m$。
第二行包含 $n$ 个整数 $d_1,d_2\ldots,d_n$,意义如【题目描述】中红色部分所示。
每行的两个数字间由单个空格隔开,数据在 Windows 下生成。**行末不保证没有多余空格**。
输出格式
一行一个整数,表示有多少种稳定的堆放零食的方法,**结果对 $998244353$ 取模**。
说明/提示
本题采用如下计分策略:
**subtask $1$**(#$1\sim{}$#$8$):$10\%$,$n,m\le5$;
**subtask $2$**(#$9\sim{}$#$12$):$30\%$,$n,m\le5\times10^2$;
**subtask $3$**(#$13\sim{}$#$16$):$20\%$,$n,m\le3\times10^3$;
**subtask $4$**(#$17\sim{}$#$24$):$40\%$,$n,m\le7\times10^3$。
对于 $100\%$ 的数据:$1\le n,m\le7\times10^3$,$0\le d_i\le m$。**你必须通过一个 subtask 内所有测试点,才被认为通过该 subtask。**
**本题开启子任务依赖。**