Cod sursa(job #1663191)

Utilizator tudorv96Tudor Varan tudorv96 Data 25 martie 2016 17:00:47
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <vector>
#include <fstream>
#include <iostream>

using namespace std;

const int MOD = 4999;

vector <pair <int, int> > M[MOD]; /// first = suma, second = frecventa
int v[1030], n, s, sol;

int query(int x) {
    int key = x % MOD;
    for (vector <pair <int, int> > :: iterator it = M[key].begin(); it != M[key].end(); ++it)
        if (it -> first == x)
            return it -> second;
    return 0;
}

void add(int x) {
    int key = x % MOD;
    for (vector <pair <int, int> > :: iterator it = M[key].begin(); it != M[key].end(); ++it)
        if (it -> first == x) {
            it -> second ++;
            return;
        }
    M[key].push_back(make_pair(x, 1));
}

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

    fin >> n >> s;
    for (int i = 0; i < n; ++i)
        fin >> v[i];

    add(v[0] + v[1]);

    for (int i = 2; i < n - 1; ++i) {
        for (int j = i + 1; j < n; ++j)
            if(s - v[i] - v[j] > 0)
                sol += query(s - v[i] - v[j]);
        for (int j = 0; j < i; ++j)
            add(v[i] + v[j]);
    }

    fout << sol;

    fout.close();
    fin.close();
    return 0;
}