#CF2227G. Drowning

    ID: 7055 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>二分数据结构数学CodeforcesCodeforces Round 1096(Div3)Div3GCF2227G2000

Drowning

题目描述

Yousef 有一个数组 aa,里面装着 nn 个正整数。

他定义了一个针对长度为 c3|c| \ge 3 的数组 cc 的“缩减操作”:

  • 选一个下标 ii(满足 1<i<c1 \lt i \lt |c|),条件是 ci1+ci+1>cic_{i-1} + c_{i+1} \gt c_i
  • 用一个整数 x=ci1ci+ci+1x = c_{i-1} - c_i + c_{i+1} 替换掉三元组 {ci1,ci,ci+1}\{c_{i-1}, c_i, c_{i+1}\}

新整数 xx 就占据原来三元组的位置,数组长度因此缩短了 22

如果一个数组能通过零次或多次这样的操作,最终缩减成只有一个元素,我们就称它是好数组。注意,长度为 11 的数组永远是好数组。

Yousef 想让你数一数,有多少对 (l,r)(l, r)(满足 1lrn1 \le l \le r \le n)使得子数组 a[l,r]a[l, r] 是好数组。

输入格式

第一行是一个整数 tt1t1041 \le t \le 10^4)——测试用例的数量。接下来是每个测试用例的描述。

每个测试用例的第一行是整数 nn1n2×1051 \le n \le 2 \times 10^5)——数组大小。

第二行有 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n1ai1091 \le a_i \le 10^9)——数组元素。

保证所有测试用例中 nn 的总和不超过 2×1052\times10^5

输出格式

每个测试用例输出一个整数——好子数组的数量。

样例

4
3
10 20 10
5
1 1 1 1 1
4
5 1 5 1
1
100
3
9
5
1

样例说明

在第一个例子中,a=[10,20,10]a = [10, 20, 10]。长度为 1 的子数组 [10][10][20][20][10][10] 都是好数组(共 33 个)。而整个子数组 [10,20,10][10, 20, 10] 不是好数组。因为缩减时必须选 i=2i=2,条件 a1+a3>a2a_1 + a_3 \gt a_2 变成 10+10>2010 + 10 \gt 20,即 20>2020 \gt 20,显然不成立。

在第二个例子中,a=[1,1,1,1,1]a = [1, 1, 1, 1, 1]

  • 所有 55 个长度为 11 的子数组都是好数组。
  • 所有 44 个长度为 22 的子数组都不是好数组。
  • 所有 33 个长度为 33 的子数组(即 [1,1,1][1, 1, 1])都是好数组,因为 1+1>11 + 1 \gt 1
  • 所有 22 个长度为 44 的子数组都不是好数组。
  • 长度为 55 的子数组是好数组:$[1, 1, 1, 1, 1] \xrightarrow{i=2} [1, 1, 1] \xrightarrow{i=2} [1]$。
  • 好子数组总数是 =5+3+1=9= 5 + 3 + 1 = 9

翻译由 ChatGPT 4.1 完成。

来源

Codeforces 2227G,英文题名 Drowning。