题解:AT_abc369_c [ABC369C] Count Arithmetic Subarrays
解题思路
由题可知,题目中的算数级数就是我们熟悉的等差数列。
对于 \(i\) 开始的一个最长的等差数列,它可以构成的等差数列的个数是 \(\frac{t \times (t + 1)}{2}\)(\(t\) 为当前等差数列的长度)。
我们又发现这个等差数列的最后一个数可能是下一个等差数列的第一个数,所以需要让 \(i = j\),而不是 \(i = j + 1\)(\(i\) 表示当前等差数列开始位置,\(j\) 表示当前等差数列结束位置)。
由于长度为 \(1\) 的等差数列会重复计算,所以需要再计算长度的时候减去一个 \(t\),再在输出的时候加上一个 \(n\)。
核心代码
int i = 1;
while (i < n) {
int j = i + 1;
int d = a[j] - a[i];
while (a[j] - a[j - 1] == d && j <= n) j ++ ;
j -- ;
int t = j - i + 1;
ans += t * (t + 1) / 2 - t;
i = j;
}
cout << ans + n;