Cod sursa(job #6978)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 21 ianuarie 2007 11:19:47
Problema Pachete Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasa a 10-a Marime 2.02 kb
#include <stdio.h>

#define NMAX 50001
#define INFI 0x3f3f3f3f

struct coord
{
 long x, y;
};

coord curnt,frm;
float MD_DR[NMAX+1],MD_ST[NMAX+1];
long i,n,dr,st,NR;

int POZITIE(long x1,long y1,long x2,long y2)
{
 int POZ=0;
 
 if (x2 > x1)
   POZ=1;
   else
 if (x2 < x1)
   POZ=0;
   else
 if (x2 == x1)
   if (y2 > y1)
     POZ=1;
     else
   if (y2 < y1)
     POZ=0;
   
 return POZ;
}

float PANTA(long x1,long y1,long x2,long y2)
{
 float panta;
 if (x2 - x1 != 0)
   panta =(float) (y2-y1) / (x2-x1);
   else panta=(float) INFI;
 return panta;
}

void Qsort_DR(long li, long ls)
{
 long i=li, j=ls;
 float x = MD_DR[(li+ls)/2], y;
 while (i<=j)
      {
       while (MD_DR[i]<x) i++;
       while (MD_DR[j]>x) j--;
       if (i<=j)
         {
          y=MD_DR[i]; MD_DR[i]=MD_DR[j]; MD_DR[j]=y;
          i++; j--;
         }
      }
 if (i<ls) Qsort_DR(i,ls);
 if (li<j) Qsort_DR(li,j);
}

void Qsort_ST(long li, long ls)
{
 long i=li, j=ls;
 float x = MD_ST[(li+ls)/2], y;
 while (i<=j)
      {
       while (MD_ST[i]<x) i++;
       while (MD_ST[j]>x) j--;
       if (i<=j)
         {
          y=MD_ST[i]; MD_ST[i]=MD_ST[j]; MD_ST[j]=y;
          i++; j--;
         }
      }
 if (i<ls) Qsort_ST(i,ls);
 if (li<j) Qsort_ST(li,j);
}

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

 scanf("%ld",&n);
 scanf("%ld%ld",&frm.x,&frm.y);
 dr=0; st=0;
 for (i=1;i<=n;i++)
    {
     scanf("%lld%lld",&curnt.x,&curnt.y);
     if (POZITIE(frm.x,frm.y,curnt.x,curnt.y)==1)
       MD_DR[++dr]=(float) PANTA(frm.x,frm.y,curnt.x,curnt.y);
       else
     if (POZITIE(frm.x,frm.y,curnt.x,curnt.y)==0)
       MD_ST[++st]=(float) PANTA(frm.x,frm.y,curnt.x,curnt.y);
    }

 Qsort_DR(1,dr);
 Qsort_ST(1,st);

 NR=n;
 for (i=1;i<=dr-1;i++)
    if (MD_DR[i] == MD_DR[i+1])
      NR--;
 for (i=1;i<=st-1;i++)
    if (MD_ST[i] == MD_ST[i+1])
      NR--;

 printf("%ld",NR);

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