lunes, 24 de octubre de 2011

837 - Light and Transparency, uva

#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstdio>
#include<map>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#define db(a) cout << #a << " = " << a << endl;
#define db2(a, b) cout << #a << " = " << a << " -- "<< #b << " = " << b << endl;
#define foreach(it, l) for(typeof(l.begin()) it = l.begin(); it != l.end(); it++)
using namespace std;
struct segmento{
	double x0, x, factor;
	segmento(double px0, double px, double pfactor):x0(px0), x(px), factor(pfactor){};
};
int main(){
	int t, n;
	double x1, y1, x2, y2, factor;
	char num_seg[10];
	string linea;
	stringstream ss;
	cin.getline(num_seg, 10, '\n');
	t = atoi(num_seg);
	vector segmentos;
	vector puntos;
	for(int i = 0; i < t; i++){
		segmentos.clear();
		puntos.clear();
		getchar();
		cin.getline(num_seg, 10, '\n');
		n = atoi(num_seg);
		for(int k = 0; k < n; k++){
			getline(cin , linea);
			ss.clear();
			ss << linea;
			ss >> x1 >> y1 >> x2 >> y2 >> factor;
			puntos.push_back(x1);
			puntos.push_back(x2);
			if(x1 > x2) swap(x1, x2);
			segmento el_segmento(x1, x2, factor);
			segmentos.push_back(el_segmento);
		}
		//para los puntos
		set setpuntos(puntos.begin(), puntos.end());
		vector puntitos(setpuntos.begin(), setpuntos.end());
		sort(puntitos.begin(), puntitos.end());
		int puntos_size = puntitos.size();
		printf("%d\n", puntos_size + 1);
		printf("-inf %.3f 1.000\n",puntitos[0]);
		for(int k = 0; k + 1 < puntos_size; k++){
			factor = 1.0;
			double x = puntitos[k];
			for(int h = 0; h < segmentos.size(); h++){
				if(segmentos[h].x0 <= x && x < segmentos[h].x)
					factor *= segmentos[h].factor;
			}
			printf("%.3f %.3f %.3f\n",x, puntitos[k + 1], factor);
		}
		printf("%.3f +inf 1.000\n",puntitos[puntos_size - 1]);
		if(i + 1 != t) printf("\n");
		
		
	}
	return 0;
}

No hay comentarios:

Publicar un comentario