Cod sursa(job #798995)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 17 octombrie 2012 18:36:34
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<stdio.h>
#include<fstream>
#include<vector>

using namespace std;

#define MOD 666013
#define MAXN 1030

typedef struct
{
    unsigned int val, nr;
} element;

vector < element > v[ MOD ];
vector < element > h[ MOD ];
int n, i, j;
int a[ MAXN ];
long long int L, s1, s2, res, tmp;

inline void insert_value_v(unsigned int x)
{
    int l = x % MOD;
    int ii;
    element A;

    for(ii = 0; ii < v[l].size(); ++ii)
        if(v[l][ii].val == x)
            {
                ++v[l][ii].nr;
                return;
            }

    A.val = x;
    A.nr = 1;

    v[l].push_back(A);
}

inline int search_value_v(unsigned int x)
{
    int l = x % MOD;
    int ii;

    for(ii = 0; ii < v[l].size(); ++ii)
        if(v[l][ii].val == x)
            return v[l][ii].nr;

    return 0;
}

inline void delete_value_v(unsigned int x)
{
    int l = x % MOD;
    int ii;

    for(ii = 0; ii < v[l].size(); ++ii)
        if(v[l][ii].val == x)
        {
            --v[l][ii].nr;
            return;
        }
}


int main()
{
    ifstream f("oite.in");

    f >> n >> L;
    for(i = 1; i <= n; ++i)
        f >> a[i];


    f.close();

    FILE *g = fopen("oite.out", "w");

    for(i = 1; i < n; ++i)
    {
        for(j = i + 1; j <= n; ++j)
        {
            if(L - a[i] - a[j] >= 0)
                    res += search_value_v(L - a[i] - a[j]);
        }

        for(j = 1; j < i; ++j)
            insert_value_v(a[i] + a[j]);
    }

    fprintf(g, "%lld\n", res);

    fclose(g);

    return 0;
}