Cod sursa(job #2703235)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 7 februarie 2021 18:46:39
Problema Trapez Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

struct coordonate{
    int x, y;
};
coordonate v[1001], p[1000001];

int comparare1(coordonate a, coordonate b){
    return (a.y < b.y) || ( (a.y == b.y) && (a.x <= b.x) );
}

int comparare2(coordonate a, coordonate b){
    //vreau ca tg a <= tg b
    // a.y / a.x <= b.y / b.x
    // a.y * b.x <= b.y * a.x
    return (a.y * b.x <= b.y * a.x);
}

int main()
{
    int n, k=0, l=1;
    long long nrsol=0;

    fin>>n;

    for(int i=1; i<=n; i++){
        fin>>v[i].x>>v[i].y;
    }
    sort(v+1, v+n+1, comparare1);

    for(int i=1; i<=n; i++){
        for(int j=i + 1; j<=n; j++){
            k++;
            p[k].x = v[j].x - v[i].x;
            p[k].y = v[j].y - v[i].y;
        }
    }

    sort(p+1, p+k+1, comparare2);
    //vad cate am consecutive la fel

    l=1;
    for(int i=2; i<=k; i++){
        //p[i-1].x / p[i-1].y == p[i].x / p[i].y;
        //p[i-1].x * p[i].y = p[i].x * p[i-1].y
        if(1LL * p[i].x * p[i - 1].y == 1LL * p[i - 1].x * p[i].y){
            l++;
        }
        else{
            nrsol += 1LL * l * (l - 1) / 2;
            l=1;
        }
    }
    nrsol += 1LL * l * (l - 1) / 2;

    fout<<nrsol;
}