Cod sursa(job #843173)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 27 decembrie 2012 15:27:50
Problema Trapez Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>
#include<math.h>
#include<vector>
#include<algorithm>
#define eps 1e-7
#define INF 20000007
#define pb push_back
using namespace std ;
struct brailu
{
    long  x , y;
};
vector < brailu > q ;
brailu temp ;
long n , sum , l = 1 , k ;
double v [ 500007 ] ;
double panta ( brailu a , brailu b )
{
    if ( fabs ( b . x - a . x ) < eps )
        return ( double ) INF ;
    return ( double ) ( double ) ( b . y - a . y ) / ( double ) ( b . x - a . x ) ;
}
int main ( )
{
    freopen ( "trapez.in" , "r" , stdin ) ;
    freopen ( "trapez.out" , "w" , stdout ) ;
    long n , k , l , sum ;
    k = 0 ;
    scanf ( "%ld" , & n ) ;
    for( long i = 1 ; i <= n ; ++ i )
        {
            scanf ( "%ld %ld" , & temp . x , & temp . y ) ;
            q . pb ( temp ) ; // pun in coada punctele
        }
    for( long i = 0 ; i < q . size ( ) ; ++ i )
        for( long j = i + 1 ; j < q .size ( ) ; ++ j )
            v [ ++ k ] = panta ( q [ i ] , q [ j ] ) ; // fac panta
    sort (v + 1 , v + k + 1 ) ; // sortez pantele
    sum = l = 0 ;
    for( long i = 1 ; i < k ; ++ i )
        if ( fabs ( ( double ) v [ i + 1 ] - v [ i ] ) < eps )
            ++ l ;
        else
        {
            sum += l * ( l - 1 ) / 2 ; // calculez
            l = 1 ;
        }
    printf ( "%ld\n" , sum ) ;
    return 0 ;
}