Cod sursa(job #994543)

Utilizator andrettiAndretti Naiden andretti Data 5 septembrie 2013 18:36:47
Problema Triang Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<cmath>
#include<set>
#define lb lower_bound
#define mp make_pair
#define x first
#define y second
#define eps 0.001
#define maxn 1505
using namespace std;
typedef pair<double,double> point;

int n,sol;
point p[maxn];
set <point> arb;
double c6=cos(1.0*M_PI/3),s6=sin(1.0*M_PI/3);

void read()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf",&p[i].x,&p[i].y);
        arb.insert(mp(p[i].x,p[i].y));
    }
}

void rotate(point &a)
{
    point r;
    r.x=a.x*c6-a.y*s6; r.y=a.x*s6+a.y*c6;
    a=r;
}

int check(point a)
{
    set<point>::iterator it=arb.lb(mp(a.x-eps,a.y-eps));
    if(fabs((*it).x-a.x)<=eps && fabs((*it).y-a.y)<=eps) return 1;
    return 0;
}

void solve()
{
    int i,j;
    point a;
    for(i=1;i<n;i++)
     for(j=i+1;j<=n;j++)
     {
         a.x=p[j].x-p[i].x; a.y=p[j].y-p[i].y;
         rotate(a); a.x+=p[i].x; a.y+=p[i].y;
         sol+=check(a);

         a.x=p[i].x-p[j].x; a.y=p[i].y-p[j].y;
         rotate(a); a.x+=p[j].x; a.y+=p[j].y;
         sol+=check(a);
     }
    sol/=3;
}

int main()
{
    freopen("triang.in","r",stdin);
    freopen("triang.out","w",stdout);

    read();
    solve();
    printf("%d",sol);

    fclose(stdin);
    fclose(stdout);
    return 0;
}