题解:AT_abc369_c [ABC369C] Count Arithmetic Subarrays
很水的一道题,但是硬控我半个小时呜呜呜。
它问等差数列的数量,我们发现只要找到所有的等差数列,那么答案一定包含在这些数列的连续子序列中。
求所有等差数列显然可以线性,我们求出每个等差数列的长度 \(n\),那么连续子序列个数即为 \(n(n+1)\over 2\)。
至于求的话我定义了两个指针,每次满足差相等的话右指针右移,否则统计答案,重新赋值指针即可。
给出我的代码:
for(int i=2;i<=n;i++)
{
if(a[i]-a[i-1]==cha)r++;
else
{
num=r-l+1;
ans=ans+pre[num];
l=i-1;
r=i;
cha=a[i]-a[i-1];
}
}
但是单纯做的话答案不是正确的,因为指针重新赋值的话计算答案时当前等差数列末尾元素会重复计算,所以需要统计累加答案的次数最后减去消除影响。
还有一点细节,上面的循环做完以后最后需要再操作一次计算最后一个等差数列的贡献。
然后就做完了。