题解:AT_abc369_c [ABC369C] Count Arithmetic Subarrays

题目大意

给出一个序列,求其中等差数列的个数。

分析

我们先来看样例:

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 n1 个。

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代码

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值