Cod sursa(job #1649070)

Utilizator tqmiSzasz Tamas tqmi Data 11 martie 2016 12:28:18
Problema Trapez Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("trapez.in");
ofstream fout("trapez.out");
struct panta
{
    long long x,y,s;
};
vector <panta> p;
panta a,c[1005];
long long N,i,j,d,X,Y,K,k,Sol,L2;
long long comp(panta a,panta b)
{
    if( a.x == b.x )
        return ( a.y < b.y );
    return ( a.x < b.x );
}
void read()
{
    fin>>N;
    for(i=1;i<=N;i++)
    {
        fin>>c[i].x;
        fin>>c[i].y;
    }
    sort(c+1,c+N+1,comp);
}
bool Compare( panta a , panta b )
{
    if(a.s == b.s)
    {
        if( a.x == b.x )
            return ( a.y < b.y );
        else
            return ( a.x < b.x );
    }
    return a.s < b.s;
}
long long Abs(long long a)
{
    if(a<0)
        return -a;
    return a;
}
long long cmmdc(long long a, long long b)
{
    if(!b)
    {
        return a;
    }
    return cmmdc(b,a%b);
}
void solve()
{
    for(i=1;i<=N;i++)
    {
        for(j=i+1;j<=N;j++)
        {
            X=c[i].x-c[j].x;
            Y=c[i].y-c[j].y;
            if((X>0 && Y<0) || (X<0 && Y>0))
            {
                a.s=-1;
            }
            else
            {
                a.s=1;
            }
            X=Abs(X);
            Y=Abs(Y);
            d=Abs(cmmdc(X,Y));
            if(d!=0)
            {
                X=X/d;
                Y=Y/d;
            }
            a.x=X;
            a.y=Y;
            p.push_back(a);
        }
    }
    sort(p.begin(),p.end(),Compare);
    L2=p.size();
    for(i=0;i<L2;++i)
        if(p[i].x == p[i+1].x && p[i].y == p[i+1].y && p[i].s == p[i+1].s)  k++;
        else
        {
            Sol += k*(k-1)/2;
            k = 1;
        }
    Sol += k*(k-1)/2;
    fout<<Sol<<"\n";
}
int main()
{
    read();
    solve();
    return 0;
}