Cod sursa(job #1512433)

Utilizator sirbu11Sirbu Claudiu Cosmin sirbu11 Data 28 octombrie 2015 01:53:09
Problema Rays Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <iostream>
#include <math.h>
#include <fstream>
#include<limits.h>
#include<queue>

using namespace std;

struct Segment{
	             double unghi1,unghi2;
              };

int intersectie(double x1,double y1,double x2,double y2)
{
	double max,min;
    
	max=x1;
    min=y1;
   
    if(x2>max)
       max=x2;
        
	if(y2<min)
       min=y2;

    if (max<=min)
		return 1;
	else
		return 0;

}
double unghi(long long x ,long long y)
{
    double param;
    param=x/sqrt((double)(x*x+y*y));
    return acos (param) * 180.0 / 3.14;
}

struct comparator {
                   bool operator()(Segment seg1, Segment seg2) {
					   return seg1.unghi1 > seg2.unghi1;
                  }
};

int main()
{
    double unghi1,unghi2,min1=0,max1=180,min2=0,max2=180;
	long long aux,a,b,i,n,x,y1,y2,nr1=0,nr2=0,lungime1=0,lungime2=0;
	Segment seg;

	priority_queue<Segment, std::vector<Segment>, comparator> minHeap1;
	priority_queue<Segment, std::vector<Segment>, comparator> minHeap2;

	FILE *f = fopen("rays.in","r");
	FILE *g = fopen("rays.out","w");

	fscanf(f,"%lld",&n);

	for(i=1;i<=n;i++)
	{
		fscanf(f,"%lld%lld%lld",&x,&y1,&y2);
		
		if(y1<y2)
		{
			aux=y1;
			y1=y2;
			y2=aux;
		}
		if(x>=0)
		{
			if(y1>=0)
			 unghi1 = 90-unghi(x,y1);
			else
			 unghi1 = 180-unghi(x,y1);
		
			if(y2>=0)
			 unghi2 = 90-unghi(x,y2);
			else
			 unghi2 = 180-unghi(x,y2);
		}
		else
		{
			if(y1>=0)
			 unghi1 = 90-unghi(-x,y1);
			else
			 unghi1 = 180-unghi(-x,y1);
		
			if(y2>=0)
			 unghi2 = 90-unghi(-x,y2);
			else
			 unghi2 = 180-unghi(-x,y2);
		}
		if(x>0)
		{
			seg.unghi1 = unghi1;
			seg.unghi2 = unghi2;
			minHeap1.push(seg);
		}
		else
		{
			seg.unghi1 = unghi1;
			seg.unghi2 = unghi2;
			minHeap2.push(seg);
		}

	}
	for(i=0;i<minHeap1.size();i++)
	{
		seg = minHeap1.top();
		if(intersectie(min1,max1,seg.unghi1,seg.unghi2)==0)
		{
				nr1++;
		}
		minHeap1.pop();
	}
	for(i=0;i<minHeap2.size();i++)
	{
		seg = minHeap2.top();
		if(intersectie(min2,max2,seg.unghi1,seg.unghi2)==0)
		{
				nr2++;
		}
		minHeap2.pop();
	}
	fprintf(g,"%lld",nr1+nr2+2);
    return 0;
}