Cod sursa(job #1065525)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 23 decembrie 2013 14:10:19
Problema Patrate 3 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

inline bool equals(double A,double B)
{
    return abs(A-B)<=10;
}

struct Point
{
    int x,y;
    bool operator()(Point A,Point B)
    {
        if(equals(A.x,B.x)) return (A.y<B.y);
        return (A.x<B.x);
    }
};

int N,sol;
Point P[1005],A,B;

void determine(Point A,Point &B,Point C,Point &D)
{
    B.x=A.x+A.y-C.y;
    B.y=A.y+C.x-A.x;
    D.x=C.x+A.y-C.y;
    D.y=C.y+C.x-A.x;
}

bool binary_s(Point A)
{
    int st=1,dr=N,md;
    for(; st<=dr;)
    {
        md=(st+dr)/2;
        if(equals(A.x,P[md].x) && equals(A.y,P[md].y)) return 1;
        if((A.x) < (P[md].x) || (equals(A.x,P[md].x) && (A.y) < (P[md].y)))
        {
            dr=md-1;
            continue;
        }
        if((A.x) > (P[md].x) || (equals(A.x,P[md].x) && (A.y) > (P[md].y)))
        {
            st=md+1;
            continue;
        }
    }
    return 0;
}

int main()
{
    int i,j;
    double a,b;
    freopen("patrate3.in","r",stdin);
    freopen("patrate3.out","w",stdout);
    scanf("%d",&N);
    for(i=1; i<=N; i++)
    {
        scanf("%lf%lf",&a,&b);
        P[i].x=a*100000;
        P[i].y=b*100000;
    }
    sort(P+1,P+N+1,Point());
    for(i=1; i<=N; i++)
        for(j=i+1; j<=N; j++)
        {
            determine(P[i],A,P[j],B);
            if(binary_s(A) && binary_s(B)) sol++;
        }
    printf("%d\n",sol/2);
    return 0;
}