Cod sursa(job #2283238)

Utilizator mihaicivMihai Vlad mihaiciv Data 15 noiembrie 2018 11:14:41
Problema Trapez Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

struct Punct {
    long long int x, y;
};

struct Dreapta {
    Punct p1, p2;
};

inline bool cmp(Dreapta d1, Dreapta d2) {

    return ( ( (d1.p2.y - d1.p1.y) * (d2.p2.x - d2.p1.x) < (d2.p2.y - d2.p1.y) * (d1.p2.x - d1.p1.x) ) ?  1:0 );

}

inline bool cmp2(Punct p1, Punct p2) {
    return ( (p1.x < p2.x) ? 1:0 );
}

bool commonTg(Dreapta, Dreapta);

int main() {

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

    long long int n, nrDrepte;
    f >> n;
    Punct p[n];
    for (long long int i = 0; i < n; ++i) {
        f >> p[i].x >> p[i].y;
    }
    sort(p, p + n, cmp2);
    Dreapta d[n * n];
    nrDrepte = 0;

    for (long long int i = 0; i < n; ++i) {
        for (long long int j = i + 1; j < n; ++j) {
            d[nrDrepte].p1 = p[i];
            d[nrDrepte].p2 = p[j];
            nrDrepte ++;
        }
    }

    sort(d, d + nrDrepte, cmp);

    long long int nrCurrent = 1;
    long long int answer = 0;

    for (int i = 1; i < nrDrepte; ++i) {
        if ( commonTg(d[i], d[i - 1]) ) {
            nrCurrent ++;
        } else {
            answer += (nrCurrent * (nrCurrent - 1) / 2 );
            nrCurrent = 1;
        }
    }

    /*
    for (int i = 0; i < nrDrepte; ++i) {
        cout << d[i].p1.x << " " << d[i].p1.y << " " << d[i].p2.x << " " << d[i].p2.y << "\n";
    }
    */
    g << answer;

    return 0;
}


bool commonTg(Dreapta d1, Dreapta d2) {
    return ( ( (d1.p2.y - d1.p1.y) * (d2.p2.x - d2.p1.x) == (d2.p2.y - d2.p1.y) * (d1.p2.x - d1.p1.x) ) ? 1:0 );
}