Cod sursa(job #3148638)

Utilizator andiRTanasescu Andrei-Rares andiR Data 3 septembrie 2023 01:42:55
Problema Triang Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <iomanip>
#include <vector>

#pragma GCC optimize("O3")
#define fi first
#define se second
#define pb push_back
#define pf push_front

using namespace std;
ifstream fin ("triang.in");
ofstream fout ("triang.out");
typedef long long ll;
const ll Nmax=1500, inf=1e9+5;
using pll=pair<ll, ll>;
struct point{
    double x, y;
};
double distsq(point a, point b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

int n;
point v[Nmax];
void solve2(double a, double b,  double c, double &s1, double &s2){
    double d=b*b-4*a*c;
    s1=(-b+sqrt(d))/(2*a);
    s2=(-b-sqrt(d))/(2*a);
}
void rot(double &a){
    a=round(a* 1000.0) / 1000.0;
}
map<pair<double, double>, int> mp;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    fin>>n;
    for (int i=0; i<n; i++)
        fin>>v[i].x>>v[i].y;
    ll sol=0;
    for (int i=0; i<n; i++){
        for (int j=i+1; j<n; j++){
            sol+=mp[{v[j].x, v[j].y}];
            double a1, a2, b1, b2;
            double x1=-2*v[i].x, y1=-2*v[i].y, z1=v[i].x*v[i].x+v[i].y*v[i].y-distsq(v[i], v[j]),
                   x2=-2*v[j].x, y2=-2*v[j].y, z2=v[j].x*v[j].x+v[j].y*v[j].y-distsq(v[i], v[j]);
            if (x1==x2){
                b1=b2=-(z1-z2)/(y1-y2);
                solve2(1, x1, b1*b1+y1*b1+z1, a1, a2);
            }
            else{
                double k1=-(y1-y2)/(x1-x2), k2=-(z1-z2)/(x1-x2);
                solve2(k1*k1+1, 2*k1*k2+x1*k1+y1, k2*k2+x1*k2+z1, b1, b2);
                a1=b1*k1+k2, a2=b2*k1+k2;
            }
            rot(a1); rot(a2); rot(b1); rot(b2);
            mp[{a1, b1}]++;
            mp[{a2, b2}]++;
        }
        mp.clear();
    }
    fout<<sol;
    return 0;
}