Cod sursa(job #829971)

Utilizator tester9x9Tester9x9 tester9x9 Data 6 decembrie 2012 09:18:09
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <vector>
#define MOD 40007
#define NM 1030
#define val first
#define count second

using namespace std;

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

vector< pair<int, int> > H1[MOD];
vector< pair<int, int> > H2[MOD];
vector< pair<int, int> >::iterator it;

int V[NM];
int N,i,j,L;
int X;

void InsertH1 (int X)
{
    int L=X%MOD;

    for (it=H1[L].begin(); it!=H1[L].end(); ++it)
        if (it->val==X)
        {
            ++it->count;
            return;
        }

    H1[L].push_back(make_pair(X,1));
}

void InsertH2 (int X)
{
    int L=X%MOD;

    for (it=H2[L].begin(); it!=H2[L].end(); ++it)
        if (it->val==X)
        {
            ++it->count;
            return;
        }

    H2[L].push_back(make_pair(X,1));
}

int FindH2 (int X)
{
    int L=X%MOD;

    for (it=H2[L].begin(); it!=H2[L].end(); ++it)
        if (it->val==X)
            return it->count;

    return 0;
}

int FindH1 (int V, int X)
{
    int ANS=0;
    if (V==X-V) ANS--;

    X-=V;
    int L=X%MOD;

    for (it=H1[L].begin(); it!=H1[L].end(); ++it)
        if (it->val==X)
        {
            ANS+=it->count;
            break;
        }

    return ANS;
}


int main ()
{
    f >> N >> L;
    for (i=1; i<=N; i++)
    {
        f >> V[i];
        InsertH1(V[i]);
    }

    for (i=1; i<=N; i++)
        for (j=i+1; j<=N; j++)
            InsertH2(V[i]+V[j]);

    int ANS=0;

    for (i=1; i<=N; i++)
        for (j=i+1; j<=N; j++)
            if (V[i]+V[j]<=L)
            {
                X=L-(V[i]+V[j]);
                ANS+=FindH2(X);
                if (X>=V[i]) ANS-=FindH1(V[i],X);
                if (X>=V[j]) ANS-=FindH1(V[j],X);
                if (V[i]+V[j]==X) ANS++;
            }

    g << ANS/6 << '\n';

    f.close();
    g.close();
    return 0;
}