Cod sursa(job #1645891)

Utilizator tgm000Tudor Mocioi tgm000 Data 10 martie 2016 14:15:52
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<cstdio>
#include<algorithm>
#define INFINIT 2000000000
using namespace std;
struct punct{int x,y;};
struct dreapta{int dx,dy;};
punct v[1001];
dreapta d[500501];
bool cmp(dreapta a,dreapta b){
    if(a.dx*b.dy>b.dx*a.dy)
        return true;
    else
        return false;
}
void reducere(int &a,int &b){
    int ca,cb,r;
    ca=a;
    cb=b;
    while(cb!=0){
        r=ca%cb;
        ca=cb;
        cb=r;
    }
    a/=ca;
    b/=ca;
}
int main(){
    int n,i,ind,j,l,nr;
    freopen("trapez.in","r",stdin);
    freopen("trapez.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d%d",&v[i].x,&v[i].y);
    ind=1;
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++){
            d[ind].dx=v[i].x-v[j].x;
            d[ind].dy=v[i].y-v[j].y;
            if(d[ind].dx==0){
                d[ind].dx=1;
                d[ind].dy=INFINIT;
            }else
                reducere(d[ind].dx,d[ind].dy);
            ind++;
        }
    ind--;
    sort(d+1,d+ind+1,cmp);
    l=1;
    nr=0;
    for(i=1;i<ind;i++){
        if(d[i].dx==d[i+1].dx&&d[i].dy==d[i+1].dy)
            l++;
        else{
            nr+=(l*(l-1))/2;
            l=1;
        }
    }
    nr+=(l*(l-1))/2;
    printf("%d",nr);
    return 0;
}