Pagini recente » Cod sursa (job #2988709) | Cod sursa (job #686895) | Cod sursa (job #495739) | Cod sursa (job #602723) | Cod sursa (job #468204)
Cod sursa(job #468204)
#include<stdio.h>
#define minim(a,b) (a<b ? a : b)
int n,d[100006],l,r,st,dr;
int v[100006],dif[100006];
int main ()
{
int i,c;
freopen("numarare.in","r",stdin);
freopen("numarare.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<n;i++)
dif[i]=v[i]-v[i+1];
l=r=1;d[1]=1;
for(i=2;i<n;i++)
if(i>r)
{
d[i]=1;st=i-1;dr=i+1;
while(dif[st]==dif[dr] && st && dr<n)
{
d[i]++;
st--;
dr++;
}
l=st+1;r=dr-1;
}
else
{
c=(l+r)/2;
if(d[2*c-i]<=r-i)
{
d[i]=d[2*c-i];
continue;
}
d[i]=minim(d[2*c-i],n-i);
st=i-d[i];dr=i+d[i];
while(dif[st]==dif[dr] && st && dr<n)
{
d[i]++;
st--;
dr++;
}
l=st+1;r=dr-1;
}
int s=0;
for(i=1;i<n;i++)
s+=d[i];
printf("%d\n",s);
return 0;
}