Cod sursa(job #2482017)

Utilizator AlexutAlex Calinescu Alexut Data 27 octombrie 2019 18:17:35
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>

using namespace std;

#define maxn 100010

int n, i, j, k, st, dr, cmax, drm;
int v[maxn], s[maxn];
long long sol;

int main()
{
    freopen("numarare.in", "r", stdin);
    freopen("numarare.out", "w", stdout);
    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
        scanf("%d", &v[i]);
    for(int i=1; i<n; ++i)
    {
        v[i]-=v[i+1];
        s[i]=1;
    }
    cmax=drm=1;
    n--;
    for(int i=1; i<=n; ++i)
    {
        if(drm>=i)
            s[i]=s[2*cmax-i];
        else
            s[i]=1;
        dr=i+s[i]/2;
        st=i-s[i]/2;
        if(dr>drm)
        {
            s[i]-=2*(dr-drm);
            st+=dr-drm;
            dr=drm;
        }
        while(v[st-1]==v[dr+1] && st>1 && dr<n)
        {
            s[i]+=2;
            st--;
            dr++;
        }
        if(dr>drm)
        {
            cmax=i;
            drm=dr;
        }
        sol+=s[i]/2+1;
    }
    printf("%d\n", sol);
    return 0;
}