Cod sursa(job #1095154)

Utilizator andrettiAndretti Naiden andretti Data 30 ianuarie 2014 15:10:38
Problema Patrate 3 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.21 kb
#include<stdio.h>
#include<algorithm>
#include<math.h>
#define maxn 1005
#define eps 0.0001
using namespace std;

struct point{double x,y;} a[maxn];
int n,sol;

void read()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%lf%lf",&a[i].x,&a[i].y);
}

bool cmp(const point &a,const point &b){
    if(fabs(a.x-b.x)<eps) return a.y<b.y;
    return a.x<b.x;
}

int search(point p)
{
    int i,step;
    for(step=1;step<n;step<<=1);
    for(i=0;step;step>>=1)
     if(i+step<=n)
     {
         if(fabs(p.x-a[i+step].x)<eps && fabs(p.y-a[i+step].y)<eps) return 1;
         if(cmp(a[i+step],p)) i+=step;
     }
    return 0;
}

void solve()
{
    point p1,p2;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<n;i++)
     for(int j=i+1;j<=n;j++)
     if(a[i].x!=a[j].x && a[i].y!=a[j].y)
     {
         p1.x=a[i].x+a[i].y-a[j].y; p1.y=a[i].y+a[j].x-a[i].x;
         p2.x=a[j].x+a[i].y-a[j].y; p2.y=a[j].y+a[j].x-a[i].x;
         if(search(p1) && search(p2)) sol++;
     }
}

int main()
{
    freopen("patrate3.in","r",stdin);
    freopen("patrate3.out","w",stdout);

    read();
    solve();
    printf("%d",sol/2);

    fclose(stdin);
    fclose(stdout);
    return 0;
}