大水题,但wa了几次。。。
思路:用一个数组保存相邻两数的差,然后过一遍数组,连续的b2可以,连续的b1之后再连续的b2也可以.。这题的个数用longlong,这个注意到了,我用len表示来连续的个数,sum+=(len+1)*len/2;我len用int保存,这里int会爆掉。。。逗比错误啊
#include <iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int M=1e5+20;
typedef long long ll;
int a[M],b[M];
int main()
{
int n,b1,b2;
while(~scanf("%d",&n))
{
int i,j;
scanf("%d%d",&b1,&b2);
scanf("%d",&a[0]);
for(i=1;i<n;i++)
{
scanf("%d",&a[i]);
b[i-1]=a[i]-a[i-1];
}
i=0;
ll sum=n;
ll len=0;
//把没有价值的数去掉
while(i<n-1&&b[i]!=b1&&b[i]!=b2)
i++;
while(i<n-1)
{
if(b[i]==b2)
{
while(i<n-1&&b[i]==b2)
{
i++;
len++;
}
sum+=len*(len+1)/2;
while(i<n-1&&b[i]!=b1&&b[i]!=b2)
i++;
len=0;
}
if(i==n-1)
break;
if(b[i]==b1)
{
while(i<n-1&&b[i]==b1)
{
i++;
len++;
}
if(i==n-1)
{
sum+=(len+1)*len/2;
break;
}
if(b[i]==b2)
{
while(i<n-1&&b[i]==b2)
{
i++;
len++;
}
}
sum+=len*(len+1)/2;
while(i<n-1&&b[i]!=b1&&b[i]!=b2)
i++;
len=0;
}
}
cout<<sum<<endl;
}
return 0;
}