Cod sursa(job #64042)

Utilizator risenshineAkil Nasser risenshine Data 1 iunie 2007 11:09:21
Problema Reuniune Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 3.52 kb
#include <stdio.h>

long long x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6;
long long a, p;

void intersect(long long x1, long long y1, long long x2, long long y2, long long x3, long long y3, long long x4, long long y4,
			   long long* x5, long long* y5, long long* x6, long long* y6) {
	//printf("%d %d %d %d ", x3, y3, x4, y4);
	if (x1 < x3) {
		if (y1 < y3) {
			if (x2 < x3)
				*x5 = *y5 = *x6 = *y6 = 0;
			else if (x2 <= x4) {
				if (y2 < y3)
					*x5 = *y5 = *x6 = *y6 = 0;
				else if (y2 <= y4)
					*x5 = x3, *y5 = y3, *x6 = x2, *y6 = y2;
				else
					*x5 = x3, *y5 = y3, *x6 = x2, *y6 = y4;
			}
			else {
				if (y2 < y3)
					*x5 = *y5 = *x6 = *y6 = 0;
				else if (y2 <= y4)
					*x5 = x3, *y5 = y3, *x6 = x4, *y6 = y2;
				else
					*x5 = x3, *y5 = y3, *x6 = x4, *y6 = y4;
			}
		}
		else if (y1 <= y4) {
			if (x2 < x3)
				*x5 = *y5 = *x6 = *y6 = 0;
			else if (x2 <= x4) {
				if (y2 <= y4)
					*x5 = x3, *y5 = y1, *x6 = x2, *y6 = y2;
				else
					*x5 = x3, *y5 = y1, *x6 = x2, *y6 = y4;
			}
			else {
				if (y2 <= y4)
					*x5 = x3, *y5 = y1, *x6 = x4, *y6 = y2;
				else
					*x5 = x3, *y5 = y1, *x6 = x4, *y6 = y4;
			}
		}
		else {
			*x5 = *y5 = *x6 = *y6 = 0;
		}
	}
	else if (x1 <= x4) {
		
		if (y1 < y3) {
			if (x2 <= x4) {
				if (y2 < y3)
					*x5 = *y5 = *x6 = *y6 = 0;
				else if (y2 <= y4)
					*x5 = x1, *y5 = y3, *x6 = x2, *y6 = y2;
				else
					*x5 = x1, *y5 = y3, *x6 = x2, *y6 = y4;
			}
			else {
				if (y2 < y3)
					*x5 = *y5 = *x6 = *y6 = 0;
				else if (y2 <= y4)
					*x5 = x1, *y5 = y3, *x6 = x4, *y6 = y2;
				else
					*x5 = x1, *y5 = y3, *x6 = x4, *y6 = y4;
			}
		}
		else if (y1 <= y4) {
			if (x2 <= x4) {
				if (y2 <= y4)
					*x5 = x1, *y5 = y1, *x6 = x2, *y6 = y2;
				else
					*x5 = x1, *y5 = y1, *x6 = x2, *y6 = y4;
			}
			else {
				if (y2 <= y4)
					*x5 = x1, *y5 = y1, *x6 = x4, *y6 = y2;
				else
					*x5 = x1, *y5 = y1, *x6 = x4, *y6 = y4;
			}
		}
		else {
			*x5 = *y5 = *x6 = *y6 = 0;
		}
	}
	else
		*x5 = *y5 = *x6 = *y6 = 0;
}
long long area(long long x1, long long y1, long long x2, long long y2) {
	return (x2-x1) * (y2-y1);
}
long long perim(long long x1, long long y1, long long x2, long long y2) {
	return 2 * (x2-x1 + y2 - y1);
}

int main() {
	long long xtmp1, ytmp1, xtmp2, ytmp2, xtmp3, ytmp3, xtmp4, ytmp4;
	freopen("reuniune.in", "r", stdin);
	freopen("reuniune.out", "w", stdout);
	scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
	scanf("%lld%lld%lld%lld", &x3, &y3, &x4, &y4);
	scanf("%lld%lld%lld%lld", &x5, &y5, &x6, &y6);
	
	a += area(x1, y1, x2, y2) + area(x3, y3, x4, y4) + area(x5, y5, x6, y6);
	p += perim(x1, y1, x2, y2) + perim(x3, y3, x4, y4) + perim(x5, y5, x6, y6);
	
	intersect(x1, y1, x2, y2, x3, y3, x4, y4, &xtmp1, &ytmp1, &xtmp2, &ytmp2);
	a -= area(xtmp1, ytmp1, xtmp2, ytmp2);
	p -= perim(xtmp1, ytmp1, xtmp2, ytmp2);
	//printf("%d %d %d %d ", xtmp1, ytmp1, xtmp2, ytmp2);
	
	intersect(xtmp1, ytmp1, xtmp2, ytmp2, x5, y5, x6, y6, &xtmp3, &ytmp3, &xtmp4, &ytmp4);
	a += area(xtmp3, ytmp3, xtmp4, ytmp4);
	p += perim(xtmp3, ytmp3, xtmp4, ytmp4);

	intersect(x1, y1, x2, y2, x5, y5, x6, y6, &xtmp1, &ytmp1, &xtmp2, &ytmp2);
	//printf("%d %d %d %d ", xtmp1, ytmp1, xtmp2, ytmp2);

	a -= area(xtmp1, ytmp1, xtmp2, ytmp2);
	p -= perim(xtmp1, ytmp1, xtmp2, ytmp2);
	intersect(x3, y3, x4, y4, x5, y5, x6, y6, &xtmp1, &ytmp1, &xtmp2, &ytmp2);
	a -= area(xtmp1, ytmp1, xtmp2, ytmp2);
	p -= perim(xtmp1, ytmp1, xtmp2, ytmp2);
	printf("%lld %lld\n", a, p);

	return 0;
}