Cod sursa(job #1417747)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 10 aprilie 2015 21:47:14
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

#define inFile "trapez.in"
#define outFile "trapez.out"
#define MAX_P 1001
#define MAX_L 500001
#define INF 1<<30
#define ERR 1e-7

FILE *in = fopen(inFile, "r");
FILE *out = fopen(outFile, "w");

struct Point {
    double x;
    double y;
};

double Slope[MAX_L];
Point P[MAX_P];

inline bool Equal(double A, double B);
inline bool Lesser(double A, double B);
inline double getSlope(Point A, Point B);

int main() {
    int N, nLines = 0, i, j, nParralel;
    long long nTrapezoid = 0;
    
    fscanf(in, "%d", &N);
    for(i = 1; i <= N; i++) 
        fscanf(in, "%lf %lf", &P[i].x, &P[i].y);
        
    for(i = 1; i <= N; i++) {
        for(j = i+1; j <= N; j++) {
            ++nLines;
            if(P[j].x == P[i].x) Slope[nLines] = INF;
            else Slope[nLines] = (P[j].y - P[i].y) / (P[j].x - P[i].x);
        }
    }

    sort(Slope + 1, Slope + nLines + 1);
    //for(i = 1; i <= nLines; i++) fprintf(out, "%f - %f ----- %f - %f ----- %f\n", L[i].A.x, L[i].A.y, L[i].B.x, L[i].B.y, L[i].Slope);
    for(i = 1; i <= nLines; ) {
        for(j = i; Slope[i] == Slope[j]; i++);
        nParralel = i-j;
        nTrapezoid += (nParralel * (nParralel - 1)) / 2;
    }
    
    fprintf(out, "%lld\n", nTrapezoid);
    
    fclose(in);
    fclose(out);
    
    return 0;
}

inline bool Equal(double A, double B) {
    return fabs(A-B) < ERR;
}

inline bool Lesser(double A, double B) {
    return B-A > ERR;
}

inline double getSlope(Point A, Point B) {
    if(A.x == B.x) return INF;
    return (B.y - A.y) / (B.x - A.x);
}