Cod sursa(job #2842017)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 30 ianuarie 2022 21:45:47
Problema Trapez Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <algorithm>
#include <utility>
#include <stdio.h>
#include <vector>
 
static inline int mod( int a ) {
    return ( a <= 0 ? -a : a );
}

int GCD( int a, int b ) {
    if( !b )
        return a;
    return GCD( b, a % b );
}

#define PL std::pair<int, int>
 
struct Punct {
    int x, y;
};

std::vector<PL> val;
Punct v[ 1001 ];
int n;

int main()
{
    FILE *fin = fopen( "trapez.in", "r" );
    fscanf( fin, "%d", &n );
    for( int i = 0; i < n; i++ )
        fscanf( fin, "%d %d", &v[ i ].x, &v[ i ].y );
    fclose( fin );
    
    for( int i = 0; i < n; i++ )
        for( int j = i + 1; j < n; j++ ) {
            int gcd = GCD( mod( v[ i ].x - v[ j ].x ), mod( v[ i ].y - v[ j ].y ) );
            int x = ( v[ i ].x - v[ j ].x ) / gcd;
            int y = ( v[ i ].y - v[ j ].y ) / gcd;
            if( x > 0 && y < 0 )
                x = -x, y = -y;
            val.push_back( { x, y } );
        }
    
    std::sort( val.begin(), val.end() );

    int rez = 0;
    int cate = 1;
    PL V = val[ 0 ];
    int right = val.size();
    for( int i = 1; i < right; i++ )
        if( V == val[ i ] ) {
            rez += cate;
            ++cate;
        } else {
            V = val[ i ];
            cate = 1;
        }

    FILE *fout = fopen( "trapez.out", "w" );
    fprintf( fout, "%d\n", rez );
    fclose( fout );
    return 0;
}