Cod sursa(job #2332512)

Utilizator shantih1Alex S Hill shantih1 Data 30 ianuarie 2019 20:09:28
Problema Patrate 3 Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#define ll long long
#define db double

using namespace std;
ifstream fin("patrate3.in");
ofstream fout("patrate3.out");

int n,i,j;
ll rez;
struct per
{	db x, y;
	bool operator<(const per &alt)const
	{	return x!=alt.x ? x<alt.x : y<alt.y;	}
} v[1006],aux;
const double EPS = 1e-8;

inline bool eq(db a,db b)
{	return abs(a-b)<EPS;	}

int check(per p)
{
	int l=1,r=n,m=0;
	while(l<=r)
	{
		m=(l+r)/2;
		if(eq(p.x,v[m].x) && eq(p.y,v[m].y))	return 1;
		
		if(p<v[m])	r=m-1;
		else		l=m+1;
	}
	return 0;
}
void do_diag(per z,per u)
{
	if(z.y>u.y)
		aux=z, z=u, u=aux;
	per m={(z.x+u.x)/2,(z.y+u.y)/2},d,t;
	db dx=abs(z.x-m.x),dy=abs(z.y-m.y);
	
	if(z.x<m.x)
	{
		d.x=m.x-dy,	d.y=m.y+dx;
		t.x=m.x+dy,	t.y=m.y-dx;
	}
	else
	{
		d.x=m.x-dy, d.y=m.y-dx;
		t.x=m.x+dy,	t.y=m.y+dx;
	}
	if(check(d) && check(t))	rez++;
}
int main() {
	
	fin>>n;
	for(i=1;i<=n;i++)
		fin>>v[i].x>>v[i].y;
	sort(v+1,v+n+1);
	
	for(i=1;i<n;i++)
		for(j=i+1;j<=n;j++)
			do_diag(v[i],v[j]);
	
	fout<<rez/2<<"\n";
}