题目大意
给出一个序列,求其中等差数列的个数。
分析
我们先来看样例:
4
3 6 9 3
我们不难发现这个序列中的任意连续的长度为 1 1 1和 2 2 2的序列都是等差数列,然后还可以发现它还有一个连续的等差数列
3 6 9
然后我们就可以更据小等差数列的长度来推算有多少个长度大于2的等差数列,答案就是上一项和这一项的数值的和。但我们又会发现一种情况:这个序列 a a a有很多个长度大于3的等差数列怎么办,两种办法如果他们可以合成一个大的等差数列,那就合成,如果不行那就分开计算。
做法
先把序列中长度为 1 1 1 和 2 2 2 的等差数列的个数求出来,再把序列分解几个连续的大等差数列,再根据等差数列的长度可以拆分多少个长度大于 2 2 2 小数列,把 a n s ans ans 加上对应的数。
步骤
1先把序列中长度为 1 1 1 和 2 2 2 的等差数列的个数求出来,长度为一的有 n n n 个,为二的有 n − 1 n-1 n−1 个。
2从第二个元素开始遍历数组,初始化 l l l 为 2 2 2。( l l l 代表每个大等差数列的长度)
2.1如果当前元素与后一个元素与前一个元素能构成等差数列,则 l l l 增加 1 1 1。
2.2否则,把 a n s ans ans 加上长度 l l l 为等差数列能拆分的长度大于 2 2 2数列个数,并重置 l l l 为 2 2 2,重新计数。
AC代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans,n,a[500005];
signed main(){
cin>>n;
ans=2*n-1;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2,l=2;i<=n;i++){
if(a[i+1]-a[i]==a[i]-a[i-1]) l++;
else{
for(int j=1;j<=l-2;j++) ans+=j;
l=2;
}
}
cout<<ans;
}