Cod sursa(job #2939282)

Utilizator rastervcrastervc rastervc Data 13 noiembrie 2022 13:47:31
Problema Patrate 3 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

constexpr size_t LIM = 1005;

class Point {
private:
	inline bool equal(double a, double b) const {
		constexpr double ERR = 1e-4;
		return abs(a - b) < ERR;
	}

public:
	double x, y;

	inline Point()
		: x(0), y(0) {}

	inline Point(double x, double y)
		: x(x), y(y) {}

	inline Point operator +(const Point& p) const {
		return Point(x + p.x, y + p.y);
	}

	inline Point operator -(const Point& p) const {
		return Point(x - p.x, y - p.y);
	}

	inline Point rot90() {
		return Point(-y, x);
	}

	inline bool operator <(const Point& p) const {
		return x < p.x || (equal(x, p.x) && y < p.y);
	}

	inline bool operator ==(const Point& p) const {
		if (equal(x, p.x) && equal(y, p.y))
			return true;
		return false;
	}

	inline bool operator <=(const Point& p) const {
		return *this < p || *this == p;
	}
} points[LIM];

int N, i, j, ans;

static inline void read() {
	ifstream fin("patrate3.in");

	fin >> N;
	for (i = 0; i < N; i++)
		fin >> points[i].x >> points[i].y;

	fin.close();
}

static inline void write() {
	ofstream fout("patrate3.out");
	fout << ans / 2;
	fout.close();
}

static inline bool search(const Point& p) {
	int step = 1, k = 0;
	for (; step < N; step <<= 1);
	for (; step; step >>= 1)
		if (k + step < N && points[k + step] <= p)
			k += step;

	return points[k] == p;
}

static inline void solve() {
	sort(points, points + N);

	for (i = 0; i < N - 1; i++) {
		for (j = i + 1; j < N; j++) {
			const Point diff = (points[j] - points[i]).rot90();
			const Point p1 = points[i] + diff;
			const Point p2 = points[j] + diff;

			if (search(p1) && search(p2)) ans++;
		}
	}
}

int main() {
	read();
	solve();
	write();
	return 0;
}