Cod sursa(job #1734755)

Utilizator danutbodbodnariuc danut danutbod Data 28 iulie 2016 10:01:10
Problema Numarare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
//#include <iostream>
//#include <cstdio>
//#include <cstring>
//#include <vector>
//#include <algorithm>
//#include <cmath>
//
//using namespace std;
//
//#define mp make_pair
//#define pb push_back
//#define ll long long
//
//#define maxN 100011
//#define inf 1000000
//
//int n, i;
//int v[maxN];
//ll ans;
//
//int len[maxN];
//int C, fin;
//
//int main()
//{
//    freopen("numarare.in","r",stdin);
//    freopen("numarare.out","w",stdout);
//
//    scanf("%d", &n);
//    for (i = 1; i <= n; i++)
//        scanf("%d", &v[i]);
//    v[0] = v[n + 1] = -inf;
//
//
//    C = fin = 0;
//    for (i = 1; i < n; i++) {
//        if (i + 1 <= fin) len[i] = min(len[2 * C - i], fin - i);
//        while (v[i] + v[i + 1] == v[i + 1 + len[i]] + v[i - len[i]]) len[i]++;
//        ans += 1LL * len[i];
//
//        if (i + len[i] >= fin) {
//            C = i;
//            fin = i + len[i];
//        }
//    }
//
//    printf("%lld", ans);
//
//    return 0;
//}
//
#include<fstream>
using namespace std;
ifstream fi("numarare.in");
ofstream fo("numarare.out");
int sum,st,dr,i,n,a[100002],lg[100002];
int main()
{
    fi>>n;
    for(i=1;i<=n;++i) fi>>a[i];
    for(i=1;i<n;i++)
    {
        st=i;dr=i+1;sum=a[st]+a[dr];
        while(st>0 && lg[st]<=1 && a[st]+a[dr]==sum)st--,dr++;
        st++;dr--;
        lg[i]=dr-i;
    }
    //for(i=1;i<=n;i++)fo<<lg[i]<<" ";fo<<endl;
    for(i=1;i<n;i++)
     if(lg[i]>1)
      {
        sum=a[i]+a[i+1];
        while(a[i-lg[i]]+a[i+1+lg[i]]==sum)
            lg[i]+=min(lg[i-lg[i]],a[i-lg[i]]);
       }
    //for(i=1;i<=n;i++)fo<<lg[i]<<" ";fo<<endl;
    long long sol=0;
    for(i=1;i<=n;i++)sol+=lg[i];
    fo<<sol<<'\n';
    return 0;
    }