链接:点击打开链接
题意:问有几个子区间,满足可以分成两段,前一段为差为d1的等差数列,后一段为差为d2的等差数列
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long a[100005],l[100005],r[100005];
int main(){
long long n,d1,d2,i,j,ans;
while(scanf("%I64d%I64d%I64d",&n,&d1,&d2)!=EOF){
for(i=1;i<=n;i++)
scanf("%I64d",&a[i]);
l[0]=0;
for(i=1;i<=n;i++){
if(i!=1&&a[i]==a[i-1]+d1)
l[i]=l[i-1]+1;
else
l[i]=1;
}
r[n+1]=0;
for(i=n;i>=1;i--){
if(i!=n&&a[i]==a[i+1]-d2)
r[i]=r[i+1]+1;
else
r[i]=1;
} //找出向左和向右的最大长度
ans=0;
if(d1!=d2){
for(i=1;i<=n;i++)
ans+=(l[i]*r[i]);
} //不相等的直接乘,否则加上右区间
else{
for(i=1;i<=n;i++)
ans+=r[i];
}
printf("%I64d\n",ans);
}
return 0;
}