设相邻差分为:
di=ai+1−ai
对于数组中的内部位置 i,要满足 ai 是波峰或波谷,即:
(ai−1≥ai且ai+1≥ai) 或 (ai−1≤ai且ai+1≤ai)
茶茶同学拿到了一个长度为 n 的整数数组 a。对任意数组 b(长度为 k),她称 b 是好的,当且仅当对其中每个内部位置 i(1<i<k)都满足:(bi−1≥bi 且 bi+1≥bi) 或 (bi−1≤bi 且 bi+1≤bi)。也就是说,bi 必须是相邻两项之间的局部极大值或局部极小值(允许相等),称为波峰/波谷。
现在她考虑原数组 a 的所有非空子数组(连续的一段),她只关心其中“好的”那些子数组,并把每个好的子数组中满足条件的“波峰/波谷”数量累加起来。
注意:长度为 1 或 2 的子数组没有内部位置,按定义它们是好的,但贡献为 0。
请你输出所有好的子数组的“波峰/波谷”总数,对 109+7 取模。
【名词解释】 子数组:从原数组中,连续的选择一段元素(可以全选)得到的新数组。
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤T≤2×105)代表数据组数,每组测试数据描述如下:
第一行输入一个整数 n(1≤n≤2×105)。
第二行输入 n 个整数 a1,a2,…,an(−109≤ai≤109)。
保证单个测试文件中所有测试数据的 n 之和不超过 2×105。
对于每组测试数据,输出一行一个整数,表示所有子数组中“波峰”和“波谷”的总数对 109+7 取模后的结果。
输入
2
5
1 3 2 4 3
5
1 2 3 4 5
输出
10
0
说明
第一组数据中,满足条件的子数组共有 3 个长度为 3 的,2 个长度为 4 的,1 个长度为 5 的(其它长度贡献为 0),总贡献为 3⋅1+2⋅2+1⋅3=10。
第二组数据严格递增,任意长度 ≥3 的子数组不可能是好的,因此答案为 0。