Cod sursa(job #1143077)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 14 martie 2014 18:10:34
Problema Patrate 3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<fstream>
#include<iostream>
#include<iomanip>
#include<math.h>
#include<algorithm>

using namespace std;

#define max_n 1010
#define eps 0.00001
#define tpdt double

ifstream f("patrate3.in");
ofstream g("patrate3.out");

int n , nr;
tpdt x1 , y12 , x2 , y2 , dx , dy , mij_x , mij_y ;


struct point{
	tpdt x , y;
	bool operator == ( point b ){
		return fabs((*this).x - b.x) <= eps && fabs((*this).y - b.y) <= eps;
	}
	bool operator < ( point b ){
		return (fabs((*this).x - b.x) <= eps) ? (*this).y < b.y : (*this).x < b.x;
	}
};

point V[max_n];

point make_point( tpdt x , tpdt y ){
	point p;
	p.x = x; p.y = y;
	return p;
}

void read(){

	f>>n;

	for( int i = 1 ; i <= n ; i++ ){
		f>>V[i].x>>V[i].y;
	}

}

bool cmp( point a , point b ){
	return fabs(a.x - b.x) <= eps ? a.y < b.y : a.x < b.x;
}

bool find( point p ){
	int st = 1 , dr = n;
	int mid = (st + dr) / 2;

	while( st <= dr ){
		if( V[mid] == p )
			return true;
		if( V[mid] < p )
			st = mid + 1;
		else
			dr = mid - 1;
		mid = (st + dr) / 2;
	}
	return false;
}

int main(){

	read();

	sort( V + 1 , V + n + 1 , cmp );

	for( int i = 1 ; i <= n ; i++ ){
		for( int j = i + 1 ; j <= n ; j++ ){
			mij_x = (V[i].x + V[j].x) / 2;
			mij_y = (V[i].y + V[j].y) / 2;
			dx = fabs(mij_x - V[i].x);
			dy = fabs(mij_y - V[i].y);
			if( V[i].y < V[j].y ){
				x1 = mij_x - dy;
				y12 = mij_y + dx;
				x2 = mij_x + dy;
				y2 = mij_y - dx;
			}
			else{
				x1 = mij_x - dy;
				y12 = mij_y - dx;
				x2 = mij_x + dy;
				y2 = mij_y + dx;
			}

			if( find( make_point(x1 , y12) ) && find( make_point(x2 , y2) ) ){
				nr++;
			}
		}
	}
		g<<nr/2<<"\n";

	return 0;
}