Cod sursa(job #1813694)

Utilizator alin1999Buzatu Alin alin1999 Data 23 noiembrie 2016 10:52:53
Problema Patrate 3 Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin("patrate3.in");
ofstream fout("patrate3.out");
struct a
{
    float absc;
    float ord;
}
coord[1005];
bool comparare(a lhs, a rhs){return lhs.absc<rhs.absc;}
bool comparare2(a lhs, a rhs){return lhs.ord<rhs.ord;}
int i,n,st,dr,mij,patrate,j,gasit;
float absc1,ord1,absc2,ord2,dx,dy,mijx,mijy;
int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
fin>>coord[i].absc>>coord[i].ord;
sort(coord+1,coord+n+1,comparare2);
sort(coord+1,coord+n+1,comparare);
for(i=1;i<=n;i++)
    {
        coord[i].absc*=10000;
        coord[i].ord*=10000;
    }

for(i=1;i<=n;i++)
    for(j=i+1;j<=n;j++)
    {
        gasit=0;
        mijx=(coord[i].absc+coord[j].absc)/2;
        mijy=(coord[i].ord+coord[j].ord)/2;
        dx=abs(mijx-coord[i].absc);
        dy=abs(mijy-coord[i].ord);
        if(coord[i].ord<coord[j].ord)
        {absc1=mijx+dy;
        ord1=mijy-dx;
        absc2=mijx-dy;
        ord2=mijy+dx;}
        else
        {
            absc1=mijx-dy;
        ord1=mijy-dx;
        absc2=mijx+dy;
        ord2=mijy+dx;
        }
        st=1;dr=n;
        while(st<=dr && gasit==0)
        {
            mij=(st+dr)/2;
            if(absc1==coord[mij].absc&&ord1==coord[mij].ord)
                gasit=1;
                else
                    {if(absc1>coord[mij].absc)
                    st=mij+1;
                if(absc1<coord[mij].absc)
                    dr=mij-1;
                    if(absc1==coord[mij].absc)
                        {if(ord1>coord[mij].absc)
                        st=mij+1;
                    else
                        dr=mij-1;}}
        }
        if(gasit==1)
        {
            st=1;dr=n;
            while(st<=dr && gasit==1)
        {
            mij=(st+dr)/2;
            if(absc2==coord[mij].absc&&ord2==coord[mij].ord)
                gasit=2;
                else
                    {if(absc2>coord[mij].absc)
                    st=mij+1;
                if(absc2<coord[mij].absc)
                    dr=mij-1;
                if(absc2==coord[mij].absc)
                    {if(ord2>coord[mij].ord)
                    st=mij+1;
                else
                    dr=mij-1;}}

        }
    }
    if(gasit==2)
        {
            patrate++;}
    }
    fout<<patrate;
    return 0;
}