Cod sursa(job #731425)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 8 aprilie 2012 00:59:15
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define U 666013
#define x first
#define n second
#define NMax 1005
#define LL long long

using namespace std;

vector < pair <int, int> > H[U];
int N, L, X[NMax];
LL S;

inline void Insert (int V)
{
    int Key=V%U;
    for (int i=0; i<(int)H[Key].size (); ++i)
    {
        if (H[Key][i].x==V)
        {
            ++H[Key][i].n; return;
        }
    }
    H[Key].push_back (make_pair (V, 1));
}

inline int Find (int V)
{
    if (V<0) return 0;
    int Key=V%U;
    for (int i=0; i<(int)H[Key].size (); ++i)
    {
        if (H[Key][i].x==V) return H[Key][i].n;
    }
    return 0;
}

void Solve ()
{
    sort (X+1, X+N+1);
    for (int i=2; i+2<=N; ++i)
    {
        for (int j=i-1; j>0; --j)
        {
            Insert (X[i]+X[j]);
        }
        for (int j=i+2; j<=N; ++j)
        {
            S+=(Find (L-X[i+1]-X[j]));
        }
    }
}

void Read ()
{
    freopen ("oite.in", "r", stdin);
    scanf ("%d %d", &N, &L);
    for (int i=1; i<=N; ++i)
    {
        scanf ("%d", &X[i]);
    }
}

void Print ()
{
    freopen ("oite.out", "w", stdout);
    printf ("%lld\n", S);
}

int main()
{
    Read ();
    Solve ();
    Print ();
    return 0;
}