Cod sursa(job #2562871)

Utilizator AffectiveSmile2Mihnea Matea AffectiveSmile2 Data 29 februarie 2020 19:07:48
Problema Trapez Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.26 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("trapez.in");
ofstream g("trapez.out");
long long int i,j,n,a,b,c,d,ctfractii,ind,rezultat,semnula,semnulb;
bool gasit=0;
struct fractii
{
    long long int numarator;
    long long int numitor;
    long long int aparitii;
} fr[10010];
struct coordonate
{
    long long int x;
    long long int y;
} p[10010];
bool cmp(coordonate a, coordonate b)
{
    if(a.x>b.x) return 0;
    else if (a.x==b.x && a.y>b.y) return 0;
    return 1;
}
int main()
{
    f>>n;
    for(i=1; i<=n; i++)
        f>>p[i].x>>p[i].y;
    sort(p+1,p+n+1,cmp);
    ///for(i=1;i<=n;i++)
       ///cout<<p[i].x<<' '<<p[i].y<<'\n';
    for(i=1; i<n; i++)
        for(j=i+1; j<=n; j++)
        {

            a=p[j].y-p[i].y;
            b=p[j].x-p[i].x;
            //cout<<i<<' '<<j<<' '<<a<<' '<<b<<' '<<'\n';
            if(a<0&&b<0)
            {
                a=-a;
                b=-b;
                semnula=1;semnulb=1;
            }
            else if(a<0)
            {
                a=-a;
                semnula=-1;
                semnulb=1;
            }
            else if(b<0)
            {
                b=-b;
                semnulb=-1;
                semnula=1;
            }
            else if(a>0&&b>0)semnula=1,semnulb=1;
                      ///  cout<<i<<' '<<j<<' '<<a<<' '<<b<<' '<<'\n';
            if(a!=0&&b!=0)
            {

                c=a;
                 d=b;
              ///  cout<<c<<d;
                while(c!=d)
                    if(c>d)c=c-d;
                    else if(d>c)d=d-c;
                if(c!=a)
                {
                    a/=c;
                    b/=c;
                }
                else if(a==b)
                    a=1,b=1;
                gasit=0;
                                for(ind=1; ind<=ctfractii; ind++)
                    if(a==fr[ind].numarator&&b==fr[ind].numitor)
                    {
                        fr[ind].aparitii++;
                        gasit=1;
                        break;
                    }
                if(gasit==0)
                {
                    ctfractii++;
                    fr[ctfractii].numarator=a*semnula;
                    fr[ctfractii].numitor=b*semnulb;
                    fr[ctfractii].aparitii++;
                }
            }

            else
            {
                gasit=0;

                for(ind=1; ind<=ctfractii; ind++)
                    if(a==fr[ind].numarator&&b==fr[ind].numitor)
                    {

                        fr[ind].aparitii++;
                        gasit=1;
                        break;
                    }
                if(gasit==0)
                {
                    ctfractii++;
                    fr[ctfractii].numarator=a*semnula;
                    fr[ctfractii].numitor=b*semnulb;
                    fr[ctfractii].aparitii++;
                }
            }


        }
       /* for(i=1; i<=ctfractii; i++)
            cout<<fr[i].numarator<<' '<<fr[i].numitor<<' '<<fr[i].aparitii<<'\n';*/
    for(i=1; i<=ctfractii; i++)
        if(fr[i].aparitii>1)
            rezultat+=(fr[i].aparitii*(fr[i].aparitii-1)/2);
    g<<rezultat;
}