Cod sursa(job #3260331)

Utilizator mihaigeorgescuGeorgescu Mihai mihaigeorgescu Data 1 decembrie 2024 17:57:29
Problema Triang Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <map>
#include <cmath>
using namespace std;
ifstream fcin("triang.in");
ofstream fout("triang.out");
int n,rez;
double dif;
map <double, int> mp;
struct pct
{
    double x;
    double y;
};
pct v[2001];
struct latura
{
    double dist;
    int nr;
};
latura lat[2000*2000];
inline double f(pct a, pct b)
{
    double dist1=abs(a.x-b.x);
    double dist2=abs(a.y-b.y);
    double val=dist1*dist1+dist2*dist2;
    val=round(val*1000)/1000;
    return val;
}
int main()
{
    dif=0.001;
    fcin>>n;
    for(int i=1; i<=n; i++)
    {
        fcin>>v[i].x>>v[i].y;
        v[i].x=round(v[i].x*1000)/1000;
        v[i].y=round(v[i].y*1000)/1000;
    }
    for(int i=1; i<n; i++)
    {
        for(int j=i+1; j<=n; j++)
        {
            double lung=f(v[i],v[j]);
            mp[lung]++;
        }
    }
    int vf=0;
    for(map <double, int>:: iterator it=mp.begin(); it!=mp.end(); it++)
    {
        lat[++vf]={it->first, it->second};
    }
    int nr=lat[1].nr;
    for(int i=2; i<=vf; i++)
    {
        //fout<<lat[i].dist<<" ";
        if(lat[i].dist==lat[i-1].dist || lat[i].dist==lat[i-1].dist-dif || lat[i].dist==lat[i-1].dist+dif)
        {
            nr=nr+lat[i].nr;
        }
        else
        {
            rez=rez+nr*(nr-1)*(nr-2)/6;
            nr=lat[i].nr;
        }
        if(i==vf)
        {
            rez=rez+nr*(nr-1)*(nr-2)/6;
            nr=lat[i].nr;
        }
    }
    fout<<rez;
    return 0;
}