Cod sursa(job #1226740)

Utilizator touristGennady Korotkevich tourist Data 7 septembrie 2014 00:37:42
Problema Oite Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <vector>
#define Nmax 1100
#define MOD 10021

using namespace std;

int N,a[Nmax];

struct el
{
    int val,ap;
};
vector <el> H[MOD],H1[MOD];

inline void AddHash(int x)
{
    int key=x%MOD;
    vector <el>::iterator it;
    for(it=H[key].begin();it!=H[key].end();++it)
        if(it->val==x)
        {
            ++it->ap;
            return;
        }
    el w;
    w.val=x; w.ap=1;
    H[key].push_back(w);
}

inline void AHash(int x)
{
    int key=x%MOD;
    vector <el>::iterator it;
    for(it=H1[key].begin();it!=H1[key].end();++it)
        if(it->val==x)
        {
            ++it->ap;
            return;
        }
    el w;
    w.val=x; w.ap=1;
    H1[key].push_back(w);
}

inline int SearchHash(int x)
{
    int key=x%MOD;
    vector <el>::iterator it;
    for(it=H[key].begin();it!=H[key].end();++it)
        if(it->val==x)
            return it->ap;
    return 0;
}

inline int SHash(int x)
{
    int key=x%MOD;
    vector <el>::iterator it;
    for(it=H1[key].begin();it!=H1[key].end();++it)
        if(it->val==x)
            return it->ap;
    return 0;
}

int main()
{
    int L,i,j,aux;
    long long sol=0;
    freopen ("oite.in","r",stdin);
    freopen ("oite.out","w",stdout);
    scanf("%d%d", &N,&L);
    for(i=1;i<=N;++i)
    {
        scanf("%d", &a[i]);
        AHash(a[i]);
    }
    for(i=1;i<N;++i)
        for(j=i+1;j<=N;++j)
            AddHash(a[i]+a[j]);
    for(i=1;i<N;++i)
        for(j=i+1;j<=N;++j)
        {
            aux=L-a[i]-a[j];
            sol+=SearchHash(aux);
            sol-=SHash(aux-a[j]);
            if(2*a[j]==aux) ++sol;
            sol-=SHash(aux-a[i]);
            if(2*a[i]==aux) ++sol;
            if(a[i]+a[j]==aux) ++sol;
        }
    printf("%lld\n", sol/6);
    return 0;
}