Cod sursa(job #407264)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 2 martie 2010 10:37:05
Problema Patrate 3 Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<stdio.h>
#define infile "patrate3.in"
#define outfile "patrate3.out"
#define nmax 1003
#define modulo 1000003
struct pct
{
	double x,y; //coord
}p[nmax]; //punctele
struct lista
{
	struct pct a;
	int p; //val si poz
} l[nmax];
int h[modulo]; //taela dispersie
int nrl; //nr-ul de elemene din lista
int n; //nr-ul de uncte
int nr; //numarul de patrate

inline int modul(int x)
{
	if(x<0) return -x; return  x;
}

inline int f(struct pct a)
{
	return modul((int)((long long)(a.x*a.y))%modulo);
}

void push(struct pct a)
{
	int x=f(a);
	nrl++; l[nrl].p=h[x]; l[nrl].a=a; h[x]=nrl;
}

int query(struct pct a)
{
	int x=f(a);
	int i;
	for(i=h[x];i;i=l[i].p)
		if(a.x==l[i].a.x && a.y==l[i].a.y)
			return 1;
	return 0;
}

struct pct pctdr(double dx, double dy, struct pct a)
{
	struct pct b;
	b.x=a.x-dy;
	b.y=a.y+dx;
	return b;
}

struct pct pctst(double dx, double dy, struct pct a)
{
	struct pct b;
	b.x=a.x+dy;
	b.y=a.y-dx;
	return b;
}

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

void init()
{
	int i;
	
	for(i=1;i<=n;i++)
		push(p[i]);
}

void sort()
{
	int i,j;
	struct pct a;
	
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
			if(p[j].y<p[i].y)
				a=p[i],p[i]=p[j],p[j]=a;
}

void solve()
{
	int i,j;
	double dx,dy;
	struct pct a,b;
	
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			dx=p[i].x-p[j].x;
			dy=p[i].y-p[j].y;
			/*
			printf("------------------------\n");
			printf("(%lf %lf)\n(%lf %lf)\n",p[i].x,p[i].y,p[j].x,p[j].y);
			printf("%lf %lf\n",dx,dy);
			*/
			//la dreapta
			a=pctdr(dx,dy,p[i]);
			b=pctdr(dx,dy,p[j]);
			//printf("(%lf %lf)\n(%lf %lf)\n",a.x,a.y,b.x,b.y);
			if(query(a) && query(b))
				nr++;
			//la stanga
			a=pctst(dx,dy,p[i]);
			b=pctst(dx,dy,p[j]);
			if(query(a) && query(b))
				nr++;
		}
}

void write()
{
	printf("%d\n",nr);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	sort();
	solve();
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}