Cod sursa(job #2876465)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 23 martie 2022 11:53:04
Problema Trapez Scor 20
Compilator cpp-64 Status done
Runda masonii Marime 1.39 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")

using namespace std;

ifstream fin  ("trapez.in");
ofstream fout ("trapez.out");

const int INF = 2e9;
const int MAX_N = 1005;

int n, len, sol;

struct point{
    int x, y;
} pct[MAX_N];

static inline bool cmpX(const point& p1, const point& p2){
    return p1.x < p2.x;
}

static inline bool cmpY(const point& p1, const point& p2){
    return p1.y < p2.y;
}

inline int _abs(const int k){
    return (k < 0 ? -k : k);
}

int rcnt;
double raport[MAX_N * MAX_N];

const double ERROR = 1e-4;

static inline bool egal(const double& a, const double& b){
    return (-ERROR <= a-b && a-b <= ERROR);
}

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>pct[i].x>>pct[i].y;

    for(int i=1; i < n; i++)
        for(int j=i+1; j<=n; j++)
            if(pct[i].y == pct[j].y)
                raport[++rcnt] = INF;
            else
                raport[++rcnt] = (double)(pct[i].x - pct[j].x) / (pct[i].y - pct[j].y);

    sort(raport+1, raport+rcnt+1);
    len = 1;
    for(int i=2; i<=rcnt; i++)
        if(egal(raport[i], raport[i-1]))
            len++;
        else{
            sol += len * (len-1) / 2;
            len = 1;
        }
    sol += len * (len-1) / 2;
    fout<<sol;
    return 0;
}