Cod sursa(job #2513836)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 23 decembrie 2019 21:06:36
Problema Oite Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("oite.in");
ofstream fout("oite.out");

#define ll long long
#define MOD 6013
#define x first
#define y second
#define mp make_pair

vector < pair< pair<int,int>,int> > SumHash[MOD];

ll L,S=0;

int n,v[2024],ok=0,nr=0;

void Read()
{
    fin>>n>>L;
    for(int i=1;i<=n;i++)
        fin>>v[i];
}

void Push_Hash(int i, int j, int k, int m)
{

}

void Push_Sum(int i, int j)
{
    S=v[i]+v[j];
    int l=S%MOD;
    SumHash[l].push_back(mp(mp(i,j),S));
}

void FirstHash()
{
    for(int i=1;i<=n-1;i++)
    {
        for(int j=i+1;j<=n;j++)
            Push_Sum(i,j);
    }
}

void FindOptim(int sum, int i, int j)
{
    int l=sum%MOD;
    for(unsigned ct=0;ct<SumHash[l].size();ct++)
    {
        int a=SumHash[l][ct].x.x;
        int b=SumHash[l][ct].x.y;
        int c=SumHash[l][ct].y;
        if(c==sum)
        {
            if(i!=a && i!=b && j!=a && j!=b)
            {
                ok=0;
                Push_Hash(i,j,a,b);
                if(!ok)
                    nr++;
            }
        }
    }
}

void SecondHash()
{
    for(int i=1;i<=n-1;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            int S=v[i]+v[j];
            int Find=L-S;
            FindOptim(Find,i,j);
        }
    }
}

int main()
{
    Read();
    FirstHash();
    SecondHash();
    fout<<nr<<'\n';
}