Pagini recente » Cod sursa (job #1857864) | Cod sursa (job #3165004) | Cod sursa (job #170096) | Cod sursa (job #219981) | Cod sursa (job #1059235)
#include <complex>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
#include <limits>
#include <vector>
#include <algorithm>
#define eps 1e-4
using namespace std;
typedef complex<double> Point;
double dot(const Point &a, const Point &b) { return real(conj(a) * b); }
double cross(const Point &a, const Point &b) { return imag(conj(a) * b); }
Point rotateBy(const Point &p, const Point &about, double radians) {
//return (p - about) * exp(Point(0, radians)) + about;
return (p - about) * Point(0, -1.0) + about;
}
int comp(const Point &a, const Point &b) {
if (fabs(real(a) - real(b)) < eps) {
if (fabs(imag(a) - imag(b)) < eps) {
return 0;
}
return imag(a) < imag(b) ? -1 : 1;
}
return real(a) < real(b) ? -1 : 1;
}
bool comp2(const Point &a, const Point &b) {
return comp(a, b) < 1;
}
int main()
{
ifstream cin("patrate3.in");
ofstream cout("patrate3.out");
vector < Point > v;
Point origin(0.0, 0.0);
int n;
cin >> n;
v.resize(n);
double a, b;
for (int i = 0; i < n; i++) {
cin >> a >> b;
v[i] = Point(a, b);
}
auto bs = [&](Point &p) {
int ret = 0;
for (int i = 1 << 10; i > 0; i >>= 1) {
if (ret + i < n && comp(p, v[ret + i]) > -1) {
ret += i;
}
}
return comp(p, v[ret]) == 0;
};
Point p, q;
int ans = 0;
sort(v.begin(), v.end(), comp2);
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
Point mid = (v[i] + v[j]) / 2.0;
p = rotateBy(v[i], mid, M_PI / 2.0);
q = rotateBy(v[j], mid, M_PI / 2.0);
if (bs(p) && bs(q)) {
ans++;
}
}
}
cout << ans / 2 << "\n";
return 0;
}