Pagini recente » Cod sursa (job #1491940) | Cod sursa (job #3217097) | Cod sursa (job #2270006) | Cod sursa (job #2496051) | Cod sursa (job #466729)
Cod sursa(job #466729)
#include<stdio.h>
#define NMAX 100010
int n,v[NMAX];
long long sum,s[NMAX];
int verif(int a,int b)
{
return (long long)s[(b<<1)-a+1]-s[a-1]==(b-a+1)*(v[b]+v[b+1]) &&
s[(b<<1)-a+1]-s[a-1]==(b-a+1)*(v[a]+v[(b<<1)-a+1]);
}
int caut(int cent)
{
int m,st,dr,i;
dr=cent;
if ((cent<<1)>n)
st=(cent<<1)-n+1;
else st=1;
while(st+1<dr)
{
m=(st+dr)>>1;
if (verif(m,cent))
dr=m;
else
st=m;
}
for (i=st;i<=dr;++i)
if (verif(i,cent))
return i;
return cent-1;
}
int main()
{
int i,j;
long long sol=0;
freopen("numarare.in","r",stdin);
freopen("numarare.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;++i)
{
scanf("%ld",&v[i]);
s[i]=(long long)s[i-1]+v[i];
}
if (n<=1000)
{
int sum=0;
for (i=1;i<n;++i)
for (j=1;j<=i;++j)
if (v[i-j+1]+v[i+j]==v[i]+v[i+1])
++sum;
else break;
printf("%lld",sum);
}
else
{
v[0]=-200001;
v[n+1]=-200001;
for(i=1;i<n;++i)
sol+=(i-caut(i)+1);
printf("%lld",sol);
}
return 0;
}