Cod sursa(job #3002368)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 14 martie 2023 18:06:34
Problema Triang Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#define eps 1e-3
using namespace std;
ifstream f("triang.in");
ofstream g("triang.out");
int n,m,sol;
const int N=1505;
double sin60;
struct pct
{
    double x,y;
}a[N];
bool cmp(pct X,pct Y)
{
    if(X.x==Y.x)
        return X.y<Y.y;
    return X.x<Y.x;
}
bool binary_(pct x)
{
    int st=1,dr=n;
    while(st<=dr)
    {
        int mj=(st+dr)/2;
        if(a[mj].x<x.x-eps)
            st=mj+1;
        else
        if(fabs(a[mj].x-x.x)<=eps)
        {
            if(a[mj].y<=x.y||fabs(a[mj].y-x.y)<=eps)
                st=mj+1;
            else
                dr=mj-1;
        }
        else
            dr=mj-1;
    }
    if(fabs(a[st-1].x-x.x)<=eps&&fabs(a[st-1].y-x.y)<=eps)
        return true;
    return false;
}
void solve(pct a, pct b)
{
    double lenght=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    ///lung laturii
    pct mj={(a.x+b.x)/2,(a.y+b.y)/2};
    ///mij lat
    ///2 var sus jos calc DX, DY
    double cosX=(b.x-a.x)/lenght;
    double sinX=(b.y-a.y)/lenght;
    double dy= lenght*sin60*cosX;
    double dx= lenght*sin60*sinX;
    ///primul pct
    pct c={mj.x+dx,mj.y-dy};
    pct d={mj.x-dx,mj.y+dy};
    if(binary_(c))
        sol++;
    if(binary_(d))
        sol++;
}
int main()
{
    f>>n;
    sin60=sqrt(3.0/4);
    for(int i=1;i<=n;i++)
        f>>a[i].x>>a[i].y;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
        {
            solve(a[i],a[j]);
        }
    g<<sol/3;
    return 0;
}