Cod sursa(job #2354895)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 25 februarie 2019 17:46:04
Problema Patrate 3 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.92 kb
#include <bits/stdc++.h>
using namespace std;
const double eps=1.e-14;
struct dd
{
    int x,y;
};
dd a[10005];
double cmp(dd a,dd b)
{
    if(a.x==b.x)return a.y<b.y;
    return a.x<b.x;
}
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("%f%f",&x,&y);
        a[i].x=ceil(x*10000);a[i].y=ceil(y*10000);}
        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;
            int 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)st=med+1;
                if(a[med].x>xc.x)dr=med-1;
                if(a[med].x==xc.x)
                {
                    if(a[med].y<xc.y){st=med+1;continue;}
                    if(a[med].y>xc.y){dr=med-1;continue;}
                    l=1;
                    break;
                }
            }
            int l1=0;
            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)st=med+1;
                if(a[med].x>xd.x)dr=med-1;
                if(a[med].x==xd.x)
                {
                    if(a[med].y<xd.y){st=med+1;continue;}
                    if(a[med].y>xd.y){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)st=med+1;
                if(a[med].x>xc.x)dr=med-1;
                if(a[med].x==xc.x)
                {
                    if(a[med].y<xc.y){st=med+1;continue;}
                    if(a[med].y>xc.y){dr=med-1;continue;}
                    l=1;
                    break;
                }
            }
            xd.x=a[i].x-y1;
            xd.y=a[i].y+x1;
            l1=0;
              st=1,dr=n;
              while(st<=dr)
            {
                int med=(st+dr)/2;
                if(a[med].x<xd.x)st=med+1;
                if(a[med].x>xd.x)dr=med-1;
                if(a[med].x==xd.x)
                {
                    if(a[med].y<xd.y){st=med+1;continue;}
                    if(a[med].y>xd.y){dr=med-1;continue;}
                    l1=1;
                    break;
                }
            }
            sum+=l*l1;
            ok=1;
        }
    }
    printf("%d\n",sum/4);
    return 0;
}