Cod sursa(job #2354947)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 25 februarie 2019 18:17:25
Problema Patrate 3 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <bits/stdc++.h>
using namespace std;
const double eps=1.e-4;
struct dd
{
    double x,y;
};
dd a[10005];
bool cmp(dd a,dd b)
{
    if(fabs(a.x-b.x)<=eps)
    {
        if(a.y-b.y>eps)return 0;
        return 1;
    }
    if(a.x-b.x>eps)return 0;
    return 1;
}
int main()
{
    freopen("patrate3.in","r",stdin);
    freopen("patrate3.out","w",stdout);
    int n,i;
    scanf("%d",&n);
    int sum=0,j;
double x,y;
    for(i=1;i<=n;i++)
        {scanf("%lf%lf",&x,&y);
        a[i].x=x;a[i].y=y;}
        sort(a+1,a+n+1,cmp);
    for(i=1;i<n;i++)
    {
        for(j=(i+1);j<=n;j++)
        {
            dd xc,xd;
            int ok=1;
            double x1=a[j].x-a[i].x,y1=a[j].y-a[i].y;
            xc.x=a[j].x+y1;
            xc.y=a[j].y-x1;
            int st=1,dr=n;
            int l=0;
            while(st<=dr)
            {
                int med=(st+dr)/2;
                if(a[med].x-xc.x<(-1)*eps){st=med+1;continue;}
                if(a[med].x-xc.x>eps){dr=med-1;continue;}

                    if(a[med].y-xc.y<(-1)*eps){st=med+1;continue;}
                    if(a[med].y-xc.y>eps){dr=med-1;continue;}
                    l=1;
                    break;

            }
            int l1=0;
            if(l==1)
            {xd.x=a[i].x+y1;
            xd.y=a[i].y-x1;
            st=1,dr=n;
            while(st<=dr)
            {
                int med=(st+dr)/2;
                if(a[med].x-xd.x<(-1)*eps){st=med+1;continue;}
                if(a[med].x-xd.x>eps){dr=med-1;continue;}

                    if(a[med].y-xd.y<(-1)*eps){st=med+1;continue;}
                    if(a[med].y-xd.y>eps){dr=med-1;continue;}
                    l1=1;
                    break;

            }}
            sum+=l*l1;
            l=0,l1=0;
            ok=1;
                        xc.x=a[j].x-y1;
            xc.y=a[j].y+x1;
            st=1,dr=n;
             l=0;
            while(st<=dr)
            {
                int med=(st+dr)/2;
                if(a[med].x-xc.x<(-1)*eps){st=med+1;continue;}
                if(a[med].x-xc.x>eps){dr=med-1;continue;}

                    if(a[med].y-xc.y<(-1)*eps){st=med+1;continue;}
                    if(a[med].y-xc.y>eps){dr=med-1;continue;}
                    l=1;
                    break;

            }
            xd.x=a[i].x-y1;
            xd.y=a[i].y+x1;
            l1=0;
            if(l==1)
              {st=1,dr=n;
            while(st<=dr)
            {
                int med=(st+dr)/2;
                if(a[med].x-xd.x<(-1)*eps){st=med+1;continue;}
                if(a[med].x-xd.x>eps){dr=med-1;continue;}

                    if(a[med].y-xd.y<(-1)*eps){st=med+1;continue;}
                    if(a[med].y-xd.y>eps){dr=med-1;continue;}
                    l1=1;
                    break;

            }
            sum+=l*l1;
              }
            ok=1;
        }
    }
    printf("%d\n",sum/4);
    return 0;
}