Cod sursa(job #41470)

Utilizator rastbananaPanait-Ardelean Alice rastbanana Data 28 martie 2007 12:00:38
Problema Reuniune Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#include <math.h>

typedef struct punct
{
long long x, y;
};

typedef struct drept
{
punct st, dr;
};
drept d[3];

long long a, p;

inline long long min(long long a, long long b)
{
	if(a < b)
		return a;
	return b;
}
inline long long max(long long a, long long b)
{
	if(a > b)
		return a;
	return b;
}

inline int se_intersecteaza(drept a, drept b)
{
	/*int x1 = min(a.st.x, a.dr.x); int x3 = min(b.st.x, b.dr.x);
	int x2 = max(a.st.x, a.dr.x); int x4 = max(b.st.x, b.dr.x);
	int y1 = min(a.st.y, a.dr.y); int y3 = min(b.st.y, b.dr.y);
	int y2 = max(a.st.y, a.dr.y); int y4 = max(b.st.y, b.dr.y);
	*/
	return (a.dr.x >= b.st.x && a.st.x <= b.dr.x && a.st.y <= b.dr.y && b.st.y <= a.dr.y);
}

drept intersectie(drept a, drept b)
{
	drept aux;

	if(se_intersecteaza(a, b))
	{
		aux.st.x = max(a.st.x, b.st.x);
		aux.st.y = max(a.st.y, b.st.y);

		aux.dr.x = min(a.dr.x, b.dr.x);
		aux.dr.y = min(a.dr.y, b.dr.y);
	}
	else
	{
		aux.st.x = aux.st.y = aux.dr.x = aux.dr.y = 0;
	}
	return aux;
}

double dist(punct a, punct b)
{
	return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}

double per(drept a)
{
	punct x;
	x.x = a.dr.x;
	x.y = a.st.y;

	return (dist(a.st, x)+dist(x, a.dr))*2;
}

double arie(drept a)
{
	punct x;
	x.x = a.dr.x;
	x.y = a.st.y;

	return (dist(a.st, x)*dist(x, a.dr));
}


int main()
{
	int i;
	drept r01, r12, r02, r012;
	freopen("reuniune.in", "r", stdin);
	freopen("reuniune.out", "w", stdout);

	for(i = 0; i < 3; ++i)
	{
		scanf("%lld %lld %lld %lld\n", &d[i].st.x, &d[i].st.y, &d[i].dr.x, &d[i].dr.y);
	}

	r01 = intersectie(d[0], d[1]);
	r12 = intersectie(d[1], d[2]);
	r02 = intersectie(d[0], d[2]);
	r012 = intersectie(r01, d[2]);

	a = arie(d[0])+arie(d[1])+arie(d[2]) - arie(r01)-arie(r12)-arie(r02)+arie(r012);
	p = per(d[0])+per(d[1])+per(d[2])-per(r01)-per(r12)-per(r02)+per(r012);

	printf("%lld %lld\n", a, p);


	fclose(stdin);
	fclose(stdout);

	return 0;
}