Cod sursa(job #2216814)

Utilizator ShutterflyFilip A Shutterfly Data 28 iunie 2018 02:02:37
Problema Oite Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <map>
using namespace std;

int v[1025];

struct MapElem {
    int cnt;
    int e1;
    int e2;
};

map<int, MapElem> mapper;

int main () {
    freopen ("oite.in", "r", stdin);
    freopen ("oite.out", "w", stdout);

    int n, val;
    scanf("%d%d", &n, &val);

    for (int i = 0; i < n; i++)
        scanf("%d", &v[i]);

    for (int i = 0; i < n; i++) {
        for (int k = i + 1; k < n; k++) {
            int sum = v[i] + v[k];
            mapper[sum].cnt++;
            mapper[sum].e1 = i;
            mapper[sum].e2 = k;
        }
    }

    int fin = 0;
    for (map<int, MapElem>::iterator i = mapper.begin(); i != mapper.end(); i++) {
        int tempval = i->first;

        //cout << tempval << " " << " " << mapper[val - tempval] << '\n';
        if (mapper[val - tempval].cnt != 0) {
            int el1 = mapper[val - tempval].e1;
            int el2 = mapper[val - tempval].e2;
            int e1 = i->second.e1;
            int e2 = i->second.e2;
            if (el1 != e1 && el1 != e2 && el2 != e1 && el2 != e2)
                fin += i->second.cnt * mapper[val - tempval].cnt;
        }
    }
    printf("%d", fin / 2);
    /*sort (v, v + n);
    int summin = v[0] + v[1] + v[2];
    int st = 0;
    int dr = n;

    int last = n;

    if (summin > val) { ///SANITY CHECK
        cout << 0;
        return 0;
    }

    while (st < dr - 1) { ///BINARY SEARCH THE RESIDUE
        int mij = (st + dr) / 2;
        if (v[mij] > val - summin) {
            dr = mij;
            last = dr;
        } else {
            st = mij;
        }
    }

    if (v[last] > val - summin) ///CLEAN THE RESIDUE
        n = last;*/
}