Cod sursa(job #120685)

Utilizator slayer4uVictor Popescu slayer4u Data 6 ianuarie 2008 12:16:11
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <stdio.h>

struct lol
{
	long x1, y1, x2, y2;
};

lol d1, d2, d3, d4;

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

long max2(long a, long b, long c)
{
	return max(max(a, b), c);
}

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

long min2(long a, long b, long c)
{
	return min(min(a, b), c);
}

long arie(lol a, lol b)
{
	lol r;
	r.x1 = max(a.x1, b.x1);
	r.y1 = max(a.y1, b.y1);
	r.x2 = min(a.x2, b.x2);
	r.y2 = min(a.y2, b.y2);

	if (r.y1 > r.y2 || r.x1 > r.x2)
		return 0;
	else 
		return (r.x2-r.x1)*(r.y2-r.y1);
}

long arie2(lol a, lol b, lol c)
{
	lol r;
	r.x1 = max2(a.x1, b.x1, c.x1);
	r.y1 = max2(a.y1, b.y1, c.y1);
	r.x2 = min2(a.x2, b.x2, c.x2);
	r.y2 = min2(a.y2, b.y2, c.y2);

	if (r.y1 > r.y2 || r.x1 > r.x2)
		return 0;
	else 
		return (r.x2-r.x1)*(r.y2-r.y1);
}

long perim(lol a, lol b)
{
	lol r;
	r.x1 = max(a.x1, b.x1);
	r.y1 = max(a.y1, b.y1);
	r.x2 = min(a.x2, b.x2);
	r.y2 = min(a.y2, b.y2);

	if (r.y1 > r.y2 || r.x1 > r.x2)
		return 0;
	else 
		return (r.x2 - r.x1)* 2 + 2 *(r.y2 - r.y1);
}

long perim2(lol a, lol b, lol c)
{
	lol r;
	r.x1 = max2(a.x1, b.x1, c.x1);
	r.y1 = max2(a.y1, b.y1, c.y1);
	r.x2 = min2(a.x2, b.x2, c.x2);
	r.y2 = min2(a.y2, b.y2, c.y2);

	if (r.y1 > r.y2 || r.x1 > r.x2)
		return 0;
	else 
		return (r.x2 - r.x1)* 2 + 2 *(r.y2 - r.y1);
}

int main()
{
	freopen ("reuniune.in", "rt", stdin);
	freopen ("reuniune.out", "wt", stdout);

	scanf("%ld %ld %ld %ld", &d1.x1, &d1.y1, &d1.x2, &d1.y2);
	scanf("%ld %ld %ld %ld", &d2.x1, &d2.y1, &d2.x2, &d2.y2);
	scanf("%ld %ld %ld %ld", &d3.x1, &d3.y1, &d3.x2, &d3.y2);
	scanf("%ld %ld %ld %ld", &d4.x1, &d4.y1, &d4.x2, &d4.y2);

	printf("%ld ", (d1.x2 - d1.x1) * (d1.y2 - d1.y1) + (d2.x2 - d2.x1) * (d2.y2 - d2.y1) + (d3.x2 - d3.x1) * (d3.y2 - d3.y1) - arie(d1, d2) - arie(d2, d3) - arie(d1, d3) + arie2(d1, d2, d3));
	printf("%ld\n", (d1.x2 - d1.x1)* 2 + 2 *(d1.y2 - d1.y1) + (d2.x2 - d2.x1)* 2 + 2 *(d2.y2 - d2.y1) + (d3.x2 - d3.x1)* 2 + 2 *(d3.y2 - d3.y1) - perim(d1, d2) - perim(d2, d3) - perim(d1, d3) + perim2(d1, d2, d3));
	return 0;
}