Pagini recente » Cod sursa (job #3361475) | Monitorul de evaluare | Diferente pentru utilizator/root intre reviziile 3 si 1 | Monitorul de evaluare | Cod sursa (job #3361460)
#include <bits/stdc++.h>
#define ld long double
#define eps ((ld)1e-10)
#pragma GCC optimize("O1")
using namespace std;
ifstream fin("patrate3.in");
ofstream fout("patrate3.out");
struct Point{
ld x,y;
bool operator<(const Point &p1) const{
// return make_pair(x + eps,y + eps) < make_pair(p1.x, p1.y);
if(x + eps != p1.x) return x + eps < p1.x;
return y + eps < p1.y;
}
bool operator ==(const Point &p1) const{
return abs(x - p1.x) <= eps && abs(y - p1.y) <= eps;
}
};
ostream & operator<<(ostream & f, const Point &p1){
f << "(" << p1.x << " , " << p1.y << ")";
return f;
}
struct Dia{
Point mid;
ld m;
ld len;
Dia(const Point &p1, const Point &p2)
{
mid = {(p1.x+ p2.x) / 2, (p1.y + p2.y) / 2};
ld dx = p1.x - p2.x;
ld dy = p1.y - p2.y;
m = dy / dx;
len = dx * dx + dy * dy;///nu ma intersesaza exact sqrt, sunt golan
}
Dia(Point p1, ld m1, ld l1){
mid = p1;
m = m1;
len = l1;
}
bool operator <(const Dia &d1) const{
// return make_tuple(mid, m + eps, len + eps) < make_tuple(d1.mid, d1.m - eps, d1.len - eps);
if(!(mid == d1.mid)) return mid < d1.mid;
if(m + eps != d1.m) return m + eps < d1.m;
return len + eps < d1.len;
}
Dia inv() const {
return Dia(mid, -1/m, len);
}
};
//ostream & operator<<(ostream & x, const Dia & d){
// x << "{ "<< d.mid << ", " << d.dx << "/" << d.dy << ", "<<d.len << " }";
// return x;
//}
int N;
vector <Point> a;
map <Dia, short int> freq;
long long ans = 0;
void read()
{
fin >> N;
a.resize(N);
for(int i=0;i<N;i++){
fin >> a[i].x >> a[i].y;
}
}
void solve()
{
for(int i=0;i<N;i++){
for(int j= 0;j < i;j++){
Dia d(a[i], a[j]);
// cout << d << "\n";
// for(int k = 0; k < i;k++){
// for(int l = 0;l < k;l++){
//
// }
// }
// ans += freq[d.inv()];
freq[d]++;
}
}
for(auto [d,cnt] : freq){
// cout << d << " : " << freq[d.inv()] * freq[d] << " " << ans<<"\n";
if(freq.find(d.inv()) != freq.end()){
ans += 1ll * cnt * freq[d.inv()];
}
}
ans /=2;
}
void write()
{
fout << ans;
}
int main()
{
read();
solve();
write();
}