Cod sursa(job #1120451)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 25 februarie 2014 00:18:32
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#include<vector>
#include<cassert>

using namespace std;

typedef long long int lld;
typedef pair<int,int> PII;
const int MOD = 10009;
const int NMAX = 1030;

struct Hash
{
    vector<PII> H[MOD+10];

    void Adauga(int x,int j)
    {
        int r=x%MOD;
        H[r].push_back(make_pair(x,j));
    }

    int Cauta(int x,int i)
    {
        if(x<0) return 0;
        int r=x%MOD,ans=0;
        vector<PII>::iterator it;
        for(it=H[r].begin(); it!=H[r].end(); it++)
            if(it->first==x && it->second<i) ans++;
        return ans;
    }
};

int N,Sol;
int A[NMAX],L;
Hash H;

int main()
{
    int i,j;

    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]);

    for(i=1; i<=N; i++)
        for(j=i+1; j<=N; j++)
        {
            if(A[i]+A[j]>L) continue;
            if(i>=3) Sol+=H.Cauta(L-A[i]-A[j],i);
            H.Adauga(A[i]+A[j],j);
        }

    printf("%d\n",Sol);

    return 0;
}