Cod sursa(job #466746)

Utilizator DraStiKDragos Oprica DraStiK Data 27 iunie 2010 14:03:17
Problema Numarare Scor 30
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1.68 kb
#include <algorithm>
using namespace std;

#define BRUTE_LIMIT 10000
#define DIM 100005
#define MAX 10005

unsigned int f[DIM];
unsigned int nrt;
int n,poz=MAX-1;
char buff[MAX];
int v[DIM];

inline void cit (int &nr)
{
    char semn;

    for (semn=1; !('0'<=buff[poz] && buff[poz]<='9'); )
    {
        if (buff[poz]=='-')
            semn=-1;
        if (++poz==MAX)
        {
            fread (buff,1,MAX,stdin);
            poz=0;
        }
    }
    for (nr=0; '0'<=buff[poz] && buff[poz]<='9'; )
    {
        nr=nr*10+buff[poz]-'0';
        if (++poz==MAX)
        {
            fread (buff,1,MAX,stdin);
            poz=0;
        }
    }
    nr*=semn;
}

void read ()
{
    int i;

    cit (n);
    for (i=1; i<=n; ++i)
        cit (v[i]);
}

void solve_brute ()
{
    int cen,i,j,lg;

    for (cen=1; cen<n; ++cen)
    {
        lg=0;
        for (i=cen, j=cen+1; i>=1 && j<=n; --i, ++j)
            if (v[i]+v[j]==v[cen]+v[cen+1])
                lg=j-cen;
            else
                break ;
        ++f[lg];
    }
    for (i=n/2; i>1; --i)
        f[i-1]+=f[i];
    for (i=1; i<=n/2; ++i)
        nrt+=f[i];
    printf ("%u",nrt);
}

void solve_bulan ()
{
    int i,cen,lg;

    for (i=2; i<=n; ++i)
        f[i]=f[i-1]+(i>>1);
    for (i=1; i<n; )
    {
        cen=1;
        for (lg=v[i+1]-v[i]; v[i+1]-v[i]==lg; ++i)
            ++cen;
        nrt+=f[cen];
    }
    printf ("%u",nrt);
}

int main ()
{
    freopen ("numarare.in","r",stdin);
    freopen ("numarare.out","w",stdout);

    read ();
    if (n<=BRUTE_LIMIT)
        solve_brute ();
    else
        solve_bulan ();

    return 0;
}