Cod sursa(job #793392)

Utilizator visanrVisan Radu visanr Data 2 octombrie 2012 20:19:23
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
using namespace std;

#define Mod 40007
#define nmax 1050
#define PII pair<int, int>
#define pb push_back
#define mp make_pair
vector<PII> :: iterator it;
vector<PII> H1[Mod], H2[Mod];
int V[nmax], N, M, X;

void Insert1(int val)
{
    int now = val % Mod;
    for(it = H1[now].begin(); it != H1[now].end(); ++it)
        if(it -> first == val)
        {
            it -> second ++;
            return ;
        }
    H1[now].pb(mp(val, 1));
}

void Insert2(int val)
{
    int now = val % Mod;
    for(it = H2[now].begin(); it != H2[now].end(); ++it)
        if(it -> first == val)
        {
            it -> second ++;
            return ;
        }
    H2[now].pb(mp(val, 1));
}

int Find1(int val, int lim)
{
    int ans = 0;
    if(val == lim - val) ans --;
    lim -= val;
    int now = lim % Mod;
    for(it = H1[now].begin(); it != H1[now].end(); ++it)
        if(it -> first == lim)
        {
            ans += it -> second;
            break;
        }
    return ans;
}

int Find2(int val)
{
    int now = val % Mod;
    for(it = H2[now].begin(); it != H2[now].end(); ++it)
        if(it -> first == val)
            return it -> second;
    return 0;
}

int main()
{
    freopen("oite.in", "r", stdin);
    freopen("oite.out", "w", stdout);
    int i, j;
    scanf("%i %i", &N, &M);
    for(i = 1; i <= N; i++)
    {
        scanf("%i", &V[i]);
        Insert1(V[i]);
    }
    for(i = 1; i <= N; i++)
        for(j = i + 1; j <= N; j++)
            Insert2(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] <= M)
            {
                int val = M - V[i] - V[j];
                ans += Find2(val);
                if(val >= V[i]) ans -= Find1(V[i], val);
                if(val >= V[j]) ans -= Find1(V[j], val);
                if(V[i] + V[j] == val) ans ++;
            }
    printf("%i\n", ans / 6);
    return 0;
}