Cod sursa(job #1081924)

Utilizator maritimCristian Lambru maritim Data 13 ianuarie 2014 22:57:41
Problema Patrate 3 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.5 kb
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
  
using namespace std;

#define er 0.0000001
  
typedef struct
{
    double m;
    double d;
    double x;
    double y;
} dreapta;
  
dreapta A[500100];
dreapta P[1001];
int N;
int nr;
int MAX;
double ct = 0;

inline int compara (double a, double b)
{
    if (fabs (a-b)<=0.00001)
        return 1;
    return 0;
}

struct Compare {
    bool operator() (const dreapta a,const dreapta b)
    {
        return a.d < b.d;
    }
} ICompare;
  
void citire(void)
{
    FILE *f = fopen("patrate3.in","r");
      
    fscanf(f,"%d",&N);
    for(int i=1;i<=N;i++)
        fscanf(f,"%lf %lf",&P[i].m,&P[i].d);
      
    fclose(f);
}
  
void prelucrare(void)
{
    for(int i=1;i<=N;i++)
        for(int j=i+1;j<=N;j++)
        {
            A[++nr].m = (P[i].d-P[j].d)/(P[i].m-P[j].m);
            A[nr].d = sqrt((P[i].d-P[j].d)*(P[i].d-P[j].d) + (P[i].m-P[j].m)*(P[i].m-P[j].m));
            A[nr].x = (P[i].m+P[j].m)/2;
            A[nr].y = (P[i].d+P[j].d)/2;
        }
}
  
void solve(void)
{
    int i=1;
    while(i<=nr)
    {
        int j=i+1;
        while(compara(A[j].d,A[i].d))
        {
            if(compara(A[i].m*A[j].m,-1) && compara(A[i].x,A[j].x) && compara(A[i].y,A[j].y))
                MAX ++;
            j ++;
        }
        i ++;
    }
}
  
int main()
{
    FILE *g = fopen("patrate3.out","w");
      
    citire();
    prelucrare();
    sort(A+1,A+nr+1,ICompare);
    solve();
    fprintf(g,"%d",MAX);
      
    fclose(g);
    return 0;
}