Cod sursa(job #468325)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 3 iulie 2010 09:36:43
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>

#define ll long long
#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]=minim(d[2*c-i],n-i);
                continue;
            }
            d[i]=r-i+1;
            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;
        }
    ll s=0;
    for(i=1;i<n;i++)
        s+=d[i];
    printf("%lld\n",s);
    return 0;
}