Cod sursa(job #2735523)

Utilizator FischerMiguel Mini Fischer Data 2 aprilie 2021 15:09:18
Problema Patrate 3 Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;

int main() {
  freopen("patrate3.in", "r", stdin);
  freopen("patrate3.out", "w", stdout);
	int n;
	scanf("%d", &n);
	vector<pair<int, int>> p(n);
	auto get = []() {
		int x = 0, y = 0;
		scanf("%d.%d", &x, &y);
		bool sign = x >= 0;
		return (sign ? 1 : -1) * (abs(x) * 10000 + y);
	};
	for (int i = 0; i < n; ++i) {
		p[i].first = get();
		p[i].second = get();
	}
	using ii = pair<int, int>;
	vector<tuple<int, int, int, int>> v;
	for (int i = 0; i < n; ++i) {
		for (int j = i + 1; j < n; ++j) {
			int x = p[i].first + p[j].first;
			int y = p[i].second + p[j].second;
			int vx = p[i].first - p[j].first;
			int vy = p[i].second - p[j].second;
			if (vx < 0 || (vx == 0 && vy < 0)) {
			  vx = -vx;
			  vy = -vy;
			} 
			int tvx = -vy;
			int tvy = vx;
			if (tvx < 0 || (tvx == 0 && tvy < 0)) {
			  tvx = -tvx;
			  tvy = -tvy;
			}
			if (ii(vx, vy) < ii(tvx, tvy)) {
			  v.emplace_back(vx, vy, x, y);
			} else {
		    v.emplace_back(tvx, tvy, x, y);
			}
		}
	}
	sort(v.begin(), v.end());
	long long ans = 0;
	for (int i = 0; i < v.size();) {
		int j = i;
		while (j < v.size() && v[i] == v[j]) j++;
		ans += (j - i) *1ll* (j - i - 1) / 2;
		i = j;
	}
	printf("%lld\n", ans);
	return 0;
}