Cod sursa(job #2002211)

Utilizator Vlad3108Tir Vlad Ioan Vlad3108 Data 19 iulie 2017 00:09:39
Problema Triang Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>
#define EPS 0.001
#define LMAX 1505
using namespace std;
int n,no=0;
struct Nodea{
    double x,y;
}v[LMAX],k;
inline bool egale(double x,double y){
    return fabs(x-y)<EPS;
}
inline bool cmp(Nodea A,Nodea B){
    return (egale(A.x,B.x)&&A.y<B.y)||(A.x<B.x);
}
inline void bSearch(Nodea k){
  int st=1,dr=n;
  while(st<=dr){
    int mij=(st+dr)/2;
    if(egale(v[mij].x,k.x)&&egale(v[mij].y,k.y)){
      ++no;
      return;
    }
    else if(v[mij].x>k.x||(egale(v[mij].x,k.x)&&v[mij].y>k.y))
      dr=mij-1;
    else st=mij+1;
  }
}
int main(){
    freopen("triang.in","r",stdin);
    freopen("triang.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%lf%lf",&v[i].x,&v[i].y);
    sort(v+1,v+n+1,cmp);
    for(int i=1;i<=n-1;++i)
        for(int j=i+1;j<=n;++j){
            double Ox=v[j].x-v[i].x,Oy=v[j].y-v[i].y;
            // sol 1
            k.x=v[i].x+(Ox-sqrt(3)*Oy)/2;
            k.y=v[i].y+(Oy+sqrt(3)*Ox)/2;
            bSearch(k);
            // sol 2
            k.x=v[i].x+(Ox+sqrt(3)*Oy)/2;
            k.y=v[i].y+(Oy-sqrt(3)*Ox)/2;
            bSearch(k);
        }
    printf("%d\n",no/3);
    fclose(stdin);fclose(stdout);
    return 0;
}