Cod sursa(job #1489545)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 21 septembrie 2015 15:45:57
Problema Trapez Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("trapez.in");
ofstream g ("trapez.out");
struct point
{
    unsigned x,y;
}v[1005];
int n,i,j,k,nr;
struct asd
{
    int a,b;
}p[1000010];

int cmmdc (int &a, int &b)
{
    //if (a*b==0) return 1;
    if (a==0)
    {
        b=1;
        return 0;
    }
    if (b==0)
    {
        a=1;
        return 0;
    }
    int x=a,y=b;
    if (a<0) a=-a;
    if (b<0) b=-b;
    int r=a%b;
    while (r!=0)
    {
        a=b;
        b=r;
        r=a%b;
    }
    x/=b;
    y/=b;
    a=x;
    b=y;
    return 0;
}

int poz(int ls, int ld)
{
    int i=ls,j=ld,sw=1;
    while (i<j)
    {
        if (p[i].a>p[j].a||(p[i].a==p[j].a&&p[i].b>p[j].b))
        {
            p[0]=p[i];
            p[i]=p[j];
            p[j]=p[0];
            sw=!sw;
        }
        i+=sw;
        j-=!sw;
    }
    return i;
}
void quick(int ls, int ld)
{
    int p;
    if (ls<ld)
    {
        p=poz(ls,ld);
        quick(ls,p-1);
        quick(p+1,ld);
    }
}

int main()
{
    f>>n;
    k=0;
    for (i=1;i<=n;i++)
        f>>v[i].x>>v[i].y;
    for (i=1;i<n;i++)
        for (j=i+1;j<=n;j++)
        {
            k++;
            p[k].a=v[j].y-v[i].y;
            p[k].b=v[j].x-v[i].x;
            int c=cmmdc(p[k].a,p[k].b);
            //p[k].a/=c;
            //p[k].b/=c;
        }
    quick(1,k);
    //for (i=1;i<=k;i++)
    //    cout<<p[i].a<<' '<<p[i].b<<'\n';
    i=1;
    while (i<k)
    {
        int z=0;
        while (p[i].a==p[i+1].a&&p[i].b==p[i+1].b&&i<=k)
        {
            i++;
            z++;
        }
        nr+=(z*(z+1)/2);
        i++;
    }
    g<<nr;
    return 0;
}