Cod sursa(job #484406)

Utilizator Addy.Adrian Draghici Addy. Data 14 septembrie 2010 01:04:32
Problema Reuniune Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.83 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const long long INF = (1LL << 31);

struct punct {
	long long X1, Y1, X2, Y2;
} P[10];

long long A, B, C, ACUB, ACUC, BCUC, ACUBCUC, XMAX, XMIN, YMAX, YMIN, X1, X2, Y1, Y2;

int cmpx (punct A, punct B) {
	return A.X1 > B.X1;
}

int cmpy (punct A, punct B) {
	return A.Y1 < B.Y1;
}

long long arie (int x, int y) {
	
	if (P[y].X2 <= P[x].X2) {
		if (P[y].Y1 < P[x].Y1) {
			if (P[y].Y2 <= P[x].Y2)
				return (P[y].X1 - P[x].X2) * (P[y].Y2 - P[x].Y1);
			else
				return (P[y].X1 - P[x].X2) * (P[x].Y2 - P[x].Y1);
		}
		else {
			if (P[y].Y2 <= P[x].Y2)
				return (P[y].X1 - P[x].X2) * (P[y].Y2 - P[y].Y1);
			else
				return (P[y].X1 - P[x].X2) * (P[x].Y2 - P[y].Y1);
		}
	}
	else {
		if (P[y].Y1 < P[x].Y1) {
			if (P[y].Y2 <= P[x].Y2)
				return (P[y].X1 - P[y].X2) * (P[y].Y2 - P[x].Y1);
			else
				return (P[y].X1 - P[y].X2) * (P[x].Y2 - P[x].Y1);
		}
		else {
			if (P[y].Y2 <= P[x].Y2)
				return (P[y].X1 - P[y].X2) * (P[y].Y2 - P[y].Y1);
			else
				return (P[y].X1 - P[y].X2) * (P[x].Y2 - P[y].Y1);
		}
	}
}

void citire () {
	
	freopen ("reuniune.in", "r", stdin);
	
	scanf ("%I64d %I64d %I64d %I64d", &P[1].Y1, &P[1].X2, &P[1].Y2, &P[1].X1);
	
	scanf ("%I64d %I64d %I64d %I64d", &P[2].Y1, &P[2].X2, &P[2].Y2, &P[2].X1);
	
	scanf ("%I64d %I64d %I64d %I64d", &P[3].Y1, &P[3].X2, &P[3].Y2, &P[3].X1);
}

void reuniune () {
	
	freopen ("reuniune.out", "w", stdout);
	
	int i;
	
	sort (P + 1, P + 4, cmpx);
	
	if (P[1].X2 >= P[2].X1) {
		printf ("0 0"); return;
	}
	
	if (P[2].X2 >= P[3].X1) {
		printf ("0 0"); return;
	}
	
	sort (P + 1, P + 4, cmpy);
	
	if (P[1].Y2 <= P[2].Y1) {
		printf ("0 0"); return;
	}
	
	if (P[2].Y2 <= P[3].Y1) {
		printf ("0 0"); return;
	}
	
	sort (P + 1, P + 4, cmpx);
	
	XMAX = P[1].X1;
	for (XMIN = INF, i = 1; i <= 3; i++)
		if (P[i].X2 < XMIN) XMIN = P[i].X2;
	
	A = (P[1].X1 - P[1].X2) * (P[1].Y2 - P[1].Y1);
	B = (P[2].X1 - P[2].X2) * (P[2].Y2 - P[2].Y1);
	C = (P[3].X1 - P[3].X2) * (P[3].Y2 - P[3].Y1);
	
	ACUB = arie (1, 2);
	ACUC = arie (1, 3);
	BCUC = arie (2, 3);
	
	if (P[2].X2 <= P[1].X2) {
		if (P[2].Y1 < P[1].Y1) {
			if (P[2].Y2 <= P[1].Y2)
				X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[1].X2, Y2 = P[2].Y2;
			else
				X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[1].X2, Y2 = P[1].Y2;
		}
		else {
			if (P[2].Y2 <= P[1].Y2)
				X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[1].X2, Y2 = P[2].Y2;
			else
				X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[1].X2, Y2 = P[1].Y2;
		}
	}
	else {
		if (P[2].Y1 < P[1].Y1) {
			if (P[2].Y2 <= P[1].Y2)
				X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[2].X2, Y2 = P[2].Y2;
			else
				X1 = P[2].X1, Y1 = P[1].Y1, X2 = P[2].X2, Y2 = P[1].Y2;
		}
		else {
			if (P[2].Y2 <= P[1].Y2)
				X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[2].X2, Y2 = P[2].Y2;
			else
				X1 = P[2].X1, Y1 = P[2].Y1, X2 = P[2].X2, Y2 = P[1].Y2;
		}
	}
	
	if (P[3].X2 <= X2) {
		if (P[3].Y1 < Y1) {
			if (P[3].Y2 <= Y2)
				ACUBCUC = (P[3].X1 - X2) * (P[3].Y2 - Y1);
			else
				ACUBCUC = (P[3].X1 - X2) * (Y2 - Y1);
		}
		else {
			if (P[3].Y2 <= Y2)
				ACUBCUC = (P[3].X1 - X2) * (P[3].Y2 - P[3].Y1);
			else
				ACUBCUC = (P[3].X1 - X2) * (Y2 - P[3].Y1);
		}
	}
	else {
		if (P[3].Y1 < Y1) {
			if (P[3].Y2 <= Y2)
				ACUBCUC = (P[3].X1 - P[3].X2) * (P[3].Y2 - Y1);
			else
				ACUBCUC = (P[3].X1 - P[3].X2) * (Y2 - Y1);
		}
		else {
			if (P[3].Y2 <= Y2)
				ACUBCUC = (P[3].X1 - P[3].X2) * (P[3].Y2 - P[3].Y1);
			else
				ACUBCUC = (P[3].X1 - P[3].X2) * (Y2 - P[3].Y1);
		}
	}
	
	sort (P + 1, P + 4, cmpy);
	
	YMIN = P[1].Y1;
	for (YMAX = -INF, i = 1; i <= 3; i++)
		if (P[i].Y2 > YMAX) YMAX = P[i].Y2;
	
	printf ("%I64d %I64d", A + B + C - ACUB - ACUC - BCUC + ACUBCUC, (XMAX - XMIN + YMAX - YMIN) * 2);
}

int main () {
	
	citire ();
	
	reuniune ();
	
	return 0;
}