Cod sursa(job #2286280)

Utilizator livliviLivia Magureanu livlivi Data 20 noiembrie 2018 00:15:39
Problema Trapez Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<cstdio>
#include<algorithm>
#define MAX 1000
using namespace std;
 
struct mazi{
    int numi,numa;
 
    bool operator < (mazi a){
        if (this-> numa<a.numa) return true;
        if (this-> numa==a.numa &&this-> numi<a.numi) return true;
        return false;
    }
 
    bool operator == (mazi a){
        if (this-> numa==a.numa &&this-> numi==a.numi) return true;
        return false;
    }
};
 
int cmmdc(int a,int b){
    int r;
 
    while(a!=0){
        r=b%a;
        b=a;
        a=r;
    }
 
    return b;
}
 
bool meow(mazi a,mazi b){
    if (a<b) return true;
    return false;
}
 
mazi v[MAX*MAX+1];
int x[MAX+1];
int y[MAX+1];
int m;
 
 
void adauga(int i,int j){
    int simp;
 
    m++;
    v[m].numa=y[j]-y[i];
    v[m].numi=x[j]-x[i];
 
    simp=cmmdc(v[m].numi,v[m].numa);
    v[m].numi/=simp;
    v[m].numa/=simp;
 
    if (v[m].numa<0){
        v[m].numa=-v[m].numa;
        v[m].numi=-v[m].numi;
    }
}
 
 
int main(){
    freopen ("trapez.in","r",stdin);
    freopen ("trapez.out","w",stdout);
    int i,j,n,cnt,rez;
 
    scanf ("%d",&n);
 
    for(i=1;i<=n;i++)
        scanf ("%d%d",&x[i],&y[i]);
 
    for(i=1;i<n;i++)
        for(j=i+1;j<=n;j++)
            adauga(i,j);
 
    n=(n-1)*n/2;
    sort(v+1,v+n+1,meow);
 
    rez=0;
    cnt=1;
    for(i=2;i<=n;i++){
        if (v[i]==v[i-1]) cnt++;
        else {
            rez=rez+(cnt-1)*cnt/2;
            cnt=1;
        }
    }
 
    printf ("%d",rez);
    return 0;
}