Cod sursa(job #2147556)

Utilizator amarghescuAnton Marghescu amarghescu Data 28 februarie 2018 20:24:08
Problema Triang Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<tr1/unordered_set>
#define eps 1e-3
using namespace std;
#define pi 3.1415926535897932384626433832795
pair<double,double>v[1505];
struct hashr{
int operator () (const pair<double,double> &x) const{
int rez=x.first*pi+x.second;
return rez;}
};
struct equali{
bool operator () (const pair<double,double> &x,const pair<double,double> &y) const{
if (abs(x.first-y.first)<eps && abs(x.second-y.second)<eps)
return 1;
return 0;}
};
tr1::unordered_set<pair<double,double>,hashr,equali>s;
double sin60=sin(60.0*pi/180.0),cos60=cos(60.0*pi/180.0);
pair<double,double> rota1(pair<double,double>x,pair<double,double>y){
pair<double,double> rez,auxy;
auxy.first=y.first-x.first;
auxy.second=y.second-x.second;
rez.first=auxy.first*cos60-auxy.second*sin60;
rez.second=auxy.first*sin60+auxy.second*cos60;
rez.first+=x.first;
rez.second+=x.second;
return rez;}
int cmp(pair<double,double>x,pair<double,double>y){
if (abs(x.first-y.first)<=eps)
return x.second-y.second<=-eps;
return x.first-y.first<=-eps;}
int main(){
freopen("triang.in","r",stdin);
freopen("triang.out","w",stdout);
int n,i,j;
long long rasp=0;
pair<double,double>rez;
scanf("%d",&n);
if (n>700){
for(i=1;i<=n;i++)
scanf("%lf%lf",&v[i].first,&v[i].second);
sort(v+1,v+n+1,cmp);
for(i=1;i<=n;i++){
for(j=1;j<i;j++){
rez=rota1(v[i],v[j]);
rasp=rasp+s.count(rez);}
s.insert(v[i]);}
printf("%lld\n",rasp);}
return 0;}