Cod sursa(job #3361458)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 24 iulie 2026 15:05:32
Problema Patrate 3 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>
#define ld 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;
    }
};

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);
    }

    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();
}