Cod sursa(job #11291)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 31 ianuarie 2007 01:06:56
Problema Patrate 3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <map>
#include <algorithm>
#include <cassert>

using namespace std;

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define mp make_pair
#define nmax 1024
#define x first
#define y second
#define BAZA 666013
#define PII pair <int,int>


int n,sol;
map < PII , int> H;
PII P[nmax];
char s[128];
int A[BAZA];

int getit()
{
	int x,y;
	scanf("%s",s);
	if(s[0]=='-')
	{
		sscanf(s+1,"%d.%04d",&x,&y);
		x=-x*10000-(y/1000)*1000-((y/100)%10)*100-((y/10)%10)*10-y%10;
	}
	else
	{
		sscanf(s,"%d.%04d",&x,&y);
		x=x*10000+(y/1000)*1000+((y/100)%10)*100+((y/10)%10)*10+y%10;
	}
	return x*2;
}

int mod(int i)
{
	return i>0?i:-i;
}

int f(PII A) 
{
	A.x=mod(A.x),A.y=mod(A.y);
	return ((A.x*5)%BAZA+(A.y%BAZA)*101)%BAZA;
}

int main()
{
	freopen("patrate3.in","r",stdin);
	freopen("patrate3.out","w",stdout);
	int i,x,y,dx,dy,mx,my,j;
	scanf("%d",&n);
	FOR(i,0,n)
	{
		x=getit(),y=getit();
		P[i]=mp(x,y);
		H[P[i]]++;
		A[f(P[i])]=1;
		assert(H[P[i]]<2);
	}

	sort(P,P+n);

	PII tmp1,tmp2;

	FOR(i,0,n) FOR(j,i+1,n)
	{
		mx=(P[i].x+P[j].x)>>1;
		my=(P[i].y+P[j].y)>>1;
		dx=mod(mx-P[i].x);
		dy=mod(my-P[i].y);
		
		if(P[i].y<P[j].y)
		{
			tmp1=mp(mx-dy,my+dx);
			tmp2=mp(mx+dy,my-dx);
		}
		else
		{
			tmp1=mp(mx-dy,my-dx);
			tmp2=mp(mx+dy,my+dx);
		}
		if(A[f(tmp1)]&&A[f(tmp2)]&&H[tmp1]&&H[tmp2])
			sol++;
	}
	printf("%d\n",sol/2);
	return 0;
}