Cod sursa(job #612224)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 6 septembrie 2011 15:45:41
Problema Oite Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<iostream>
#include<fstream>
#include<list>
using namespace std;

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

struct per {
    unsigned int lana;
    short o1,o2;
};

unsigned int n,L;
unsigned int x[1036];
list<per> l[666023];

inline int h(const per &q) {
    return (q.lana)%666013;
}

inline bool ver(const per &p1, const per &p2) {

    if(p1.o1==p2.o1 || p1.o1==p2.o2 || p1.o2==p2.o1 || p1.o2==p2.o2)
        return false;
    if(p1.o1>p1.o2 || p1.o2>p2.o1 || p2.o1>p2.o2)
        return false;

    return true;

}

inline int findd(const per &nr,const int &ll) {

    list<per>::iterator it;
    int nu=0;

    for(it=l[ll%666013].begin();it!=l[ll%666013].end(); ++it)
        if((*it).lana==ll && ver((*it),nr))
            ++nu;

    return nu;

}

inline void adauga(const per &nr) {
    l[h(nr)].push_front(nr);

}

int main() {
    int i,j;
    long long nrmod=0;
    per mm;

    in >> n >> L;

    for(i=1;i<=n;++i)
        in >> x[i];

    for(i=1;i!=n;++i)
        for(j=i+1;j<=n;++j) {
                mm.lana=x[i]+x[j];
                mm.o1=i;
                mm.o2=j;
                if(mm.lana<L)
                    adauga(mm);

        }

    for(i=1;i!=n;++i)
        for(j=i+1;j<=n;++j) {
                mm.lana=x[i]+x[j];
                mm.o1=i;
                mm.o2=j;
                nrmod+=findd(mm,L-mm.lana);

        }

    out << nrmod;

    return 0;
}