Cod sursa(job #1768929)

Utilizator cristina_borzaCristina Borza cristina_borza Data 1 octombrie 2016 18:30:45
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <algorithm>
#include <fstream>
#include <map>

#define MOD 666013

using namespace std;

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

int v[1500];
int n , l;

long long ans;

vector <pair <int , int> > G[MOD + 5];

int query(int val) {
    int hs = val % MOD;
    for (vector <pair <int , int> > :: iterator it = G[hs].begin(); it != G[hs].end(); ++it) {
        if ((*it).first == val) {
            return (*it).second;
        }
    }
    return 0;
}

void insert(int val) {
    int hs = val % MOD;
    for (vector <pair <int , int> > :: iterator it = G[hs].begin(); it != G[hs].end(); ++it) {
        if ((*it).first == val) {
            ++((*it).second);
            return;
        }
    }

    G[hs].push_back(make_pair(val , 1));
}

int main() {
    f >> n >> l;
    for (int i = 1; i <= n; ++i) {
        f >> v[i];
    }

    sort (v + 1 , v + n + 1);

    for (int i = 1; i < n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            if (v[i] + v[j] <= l)
                ans += (long long) query(l - v[i] - v[j]);
        }

        for (int j = 1; j < i; ++j) {
            insert(v[i] + v[j]);
        }
    }

    g << (long long)ans;
    return 0;
}