Cod sursa(job #115997)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 17 decembrie 2007 16:19:39
Problema Rays Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream.h>
#include <values.h>
#include <math.h>

double dr[2][200000],st[2][200000];
long nrdr,nrst,n;
double Pi=M_PI;
long nr=0;
ifstream fin("rays.in");
ofstream fout("rays.out");

void citire()
{
fin>>n;
double x,y1,y2;
for (long i=0;i<n;i++)
{
  fin>>x>>y1>>y2;
     if (y1<y2)
   {
      double aux=y1;
       y1=y2;
       y2=aux;
    }
  if (x>0)
  {
     dr[0][nrdr++]=atan2(x,y1)*180/Pi;
     dr[1][nrdr-1]=atan2(x,y2)*180/Pi;
     dr[0][nrdr-1]=90-dr[0][nrdr-1];
     dr[1][nrdr-1]=90-dr[1][nrdr-1];
     }
  else
  {  x*=-1;
     st[0][nrst++]=atan2(x,y1)*180/Pi;
     st[1][nrst-1]=atan2(x,y2)*180/Pi;
     st[0][nrst-1]=90-st[0][nrst-1];
     st[1][nrst-1]=90-st[1][nrst-1];
  }
}
fin.close();
}

void adunare(double drr[2][200000],long nrdr)
{
double min,max;

 for (long i=0;i<nrdr;i++)
     if (drr[0][i]!=MAXINT)
     {
	min=drr[1][i];
	max=drr[0][i];
	nr++;
	  for (long j=i+1;j<nrdr;j++)
	  {
	    if (drr[1][j]<=min && drr[0][j]>=max)
		drr[0][j]=MAXINT;
	    else
	      if (drr[1][j]>=min && drr[1][j]<=max && drr[0][j]>=max)
	      {
		min=drr[1][j];
		drr[0][j]=MAXINT;
	      }
	      else
		if (drr[1][j]>=min && drr[0][j]<=max)
		{
		   min=drr[1][j];
		   max=drr[0][j];
		   drr[0][j]=MAXINT;
		}
		else
		  if (drr[1][j]<=min && drr[0][j]<=max && drr[0][j]>=min)
		  {
		     max=drr[0][j];
		     drr[0][j]=MAXINT;
		  }
	  }
     }
}

int main()
{
   citire();
   adunare(dr,nrdr);
   adunare(st,nrst);
   fout<<nr<<"\n";
   fin.close();
   fout.close();
   return 0;
}