Pagini recente » Cod sursa (job #721703) | Cod sursa (job #380493) | Cod sursa (job #2721403) | Cod sursa (job #276361) | Cod sursa (job #466806)
Cod sursa(job #466806)
#include<stdio.h>
#include<math.h>
#define NMAX 100010
#define eps 0.0000000001
#define l 0.99999999999
int n,v[NMAX];
long long sum;
double hash[NMAX],s[NMAX],sumh[NMAX];
int verif(int a,int b)
{
double x;
x=fabs(s[(b<<1)-a+1]-s[b]+(hash[b-a+1])*(s[b]-s[a-1])-(sumh[(b<<1)-a+1]-sumh[b])*(v[b]+v[b+1]));
if (eps>x)
return 1;
return 0;
}
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);
hash[0]=1;
for (i=1;i<=n;++i)
{
scanf("%ld",&v[i]);
hash[i]=hash[i-1]*l;
sumh[i]=hash[i]+sumh[i-1];
s[i]=s[i-1]+v[i]*hash[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
{
for(i=1;i<n;++i)
sol+=(long long)(i-caut(i)+1);
printf("%lld",sol);
}
return 0;
}