Cod sursa(job #2460498)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 23 septembrie 2019 20:03:18
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<bits/stdc++.h>

using namespace std;
int dp[100006],v[100006],dif[100006];
int main ()
{
    ifstream cin("numarare.in");
    ofstream cout("numarare.out");
    int n,l=1,r=1,st,dr,c;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    for(int i=1;i<n;i++)
        dif[i]=v[i]-v[i+1];
    dp[1]=1;
    for(int i=2;i<n;i++)
        if(i>r)
        {
            dp[i]=1;
            st=i-1;
            dr=i+1;
            while(dif[st]==dif[dr] and st>0 and dr<n)
            {
                dp[i]++;
                st--;
                dr++;
            }
            l=st+1;
            r=dr-1;
        }
        else
        {
            c=(l+r)/2;
            if(dp[2*c-i]<=r-i)
            {
                dp[i]=min(dp[2*c-i],n-i);
                continue;
            }
            dp[i]=r-i+1;
            st=i-dp[i];
            dr=i+dp[i];
            while(dif[st]==dif[dr] and st>0 and dr<n)
            {
                dp[i]++;
                st--;
                dr++;
            }
            l=st+1;
            r=dr-1;
        }
    long long s=0;
    for(int i=1;i<n;i++)
        s+=dp[i];
    cout<<s;
    return 0;
}