Cod sursa(job #1157412)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 28 martie 2014 15:09:30
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include <fstream>
using namespace std;

ofstream g("oite.out");
ifstream f("oite.in");

#define LE 2066
#define ll long long
#define cout g
#include <vector>
#define pii pair<int,int>
#define LEX (1<<18)
#define x first
#define y second
#define mp make_pair
#define pb push_back

vector<pii> H[LEX+666];
int n,k,A[LE],i,j,L;
ll result;

int F(int V)
{
    return ((V^(V>>16))&((1<<17)-1));
}

void UP(int V)
{
    int K=F(V);
    int N=H[K].size();

    for(int i=0; i<N; ++i)
        if (H[K][i].x==V)
        {
            ++H[K][i].y;
            break;
        }
    H[K].pb(mp(V,1));
}

int QU(int V)
{
    int K=F(V);
    int N=H[K].size();

    for(int i=0; i<N; ++i)
        if (H[K][i].x==V)
            return H[K][i].y;

    return 0;
}

#include <algorithm>

int main()
{
    f>>n>>L;
    for(i=1; i<=n; ++i) f>>A[i];
    sort(A+1,A+n+1);

    for(i=1; i<=n; ++i)
    {
        for(j=i+1; j<=n; ++j)
        {
            int D=L-A[i]-A[j];
            if (D<0) continue;
            result+=(ll)QU(D);
        }

        for(j=1; j<i; ++j) UP(A[i]+A[j]);
    }

    cout<<result<<'\n';

    return 0;
}