Cod sursa(job #1766584)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 28 septembrie 2016 09:15:44
Problema Oite Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 3 kb
#include <stdio.h>
#include <stdlib.h>
#define MOD 2000000
int v[1025],next[1025*1025],lista[2000000],cdr[1025*1025],s[1025*1025],n;
void adauga(int x,int k)
{
    int p;
    if(lista[x%MOD]==0)
    {
        n++;
        s[n]=x;
        next[n]=0;
        lista[x%MOD]=n;
        cdr[n]=k;
    }
    else
    {
        p=lista[x%MOD];
        if(s[p]>=x)
        {
            if(s[p]==x)
            {
                if(cdr[p]>=k)
                {
                    n++;
                    lista[x%MOD]=n;
                    next[n]=p;
                    s[n]=x;
                    cdr[n]=k;
                }
                else
                {
                    while(next[p]!=0 && s[next[p]]==x && cdr[next[p]]<k)
                        p=next[p];
                    n++;
                    next[n]=next[p];
                    next[p]=n;
                    s[n]=x;
                    cdr[n]=k;
                }
            }
            else
            {
                n++;
                lista[x%MOD]=n;
                next[n]=p;
                s[n]=x;
                cdr[n]=k;
            }
        }
        else
        {
            while(next[p]!=0 && s[next[p]]<x) p=next[p];
            if(s[next[p]]==x)
            {
                while(next[p]!=0 && s[next[p]]==x && cdr[next[p]]<k)
                    p=next[p];
                n++;
                next[n]=next[p];
                next[p]=n;
                s[n]=x;
                cdr[n]=k;
            }
            else
            {
                n++;
                next[n]=next[p];
                next[p]=n;
                s[n]=x;
                cdr[n]=k;
            }
        }
    }
}
int cauta(int x,int k)
{
    int p=lista[x%MOD];
    if(s[p]>=x)
        if(s[p]==x)
        {
            int nr=0;
            while(next[p]!=0 && s[p]==x && cdr[p]<k)
            {
                p=next[p];
                nr++;
            }
            if(s[p]==x && cdr[p]<k)
                nr++;
            return nr;
        }
        else
            return 0;
    else{
        while(next[p]!=0 && s[next[p]]<x) p=next[p];
        if(s[next[p]]==x)
        {
            int nr=0;
            p=next[p];
            if(next[p]!=0 && s[p]==x && cdr[p]<k)
            {
                p=next[p];
                nr++;
            }
            if(s[p]==x && cdr[p]<k)
                nr++;
            return nr;
        }
        else
            return 0;
    }
}
int main()
{
    int c,l,i,j;
    long long nr;
    freopen("oite.in","r",stdin);
    freopen("oite.out","w",stdout);
    scanf("%d%d",&c,&l);
    for(i=1; i<=c; i++)
        scanf("%d",&v[i]);
    for(i=1; i<=c-3; i++)
        for(j=i+1; j<=c-2; j++)
            if(v[i]+v[j]<=l)
                adauga(v[i]+v[j],j);
    nr=0;
    for(i=3; i<=c-1; i++)
        for(j=i+1; j<=c; j++)
            nr+=cauta(l-v[i]-v[j],i);
    printf("%lld\n",nr);

    return 0;
}