Pagini recente » Cod sursa (job #220600) | Cod sursa (job #2660093) | Cod sursa (job #219594) | Cod sursa (job #1227389) | Cod sursa (job #2939282)
#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;
}