Cod sursa(job #1073658)

Utilizator danny794Dan Danaila danny794 Data 6 ianuarie 2014 17:52:17
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <cstdio>
#include <utility>

typedef long long ll;

using namespace std;

typedef struct coord {
	ll x0, y0, x1, y1;
} coord;

coord A, B, C, AB, BC, AC, ABC;

void read() {
	freopen( "reuniune.in", "r", stdin);
	freopen( "reuniune.out", "w", stdout);
	scanf("%lld%lld%lld%lld", &A.x0, &A.y0, &A.x1, &A.y1);
	scanf("%lld%lld%lld%lld", &B.x0, &B.y0, &B.x1, &B.y1);
	scanf("%lld%lld%lld%lld", &C.x0, &C.y0, &C.x1, &C.y1);
}

pair<ll,ll> intersect_segment(ll xS, ll xE, ll yS, ll yE) {
	if ( yS >= xS && yS <= xE ) {
		if ( yE >= xS && yE <= xE )
			return make_pair(yS, yE);
		else
			return make_pair(yS, xE);
	} else if ( xS >= yS && xS <= yE ){
		if ( xE >= yS && xE <= yE )
			return make_pair(xS, xE);
		else
			return make_pair(xS, yE);
	}

	return make_pair(1, 0);
}

coord intersect_rectangle(coord F, coord S) {
	pair<ll, ll> xs = intersect_segment(F.x0, F.x1, S.x0, S.x1);
	pair<ll, ll> ys = intersect_segment(F.y0, F.y1, S.y0, S.y1);

	coord C;
	C.x0 = xs.first;
	C.x1 = xs.second;
	C.y0 = ys.first;
	C.y1 = ys.second;
	return C;
}

bool check_coord(coord C) {
	if (C.x0 != 1 || C.x1 != 0)
		if (C.y0 != 1 || C.y1 != 1)
			return false;
	return true;
}

ll compute_area(coord C) {
	if (check_coord(C))
		return 0L;
	else
		return (C.x1 - C.x0) * (C.y1 - C.y0);
}

ll compute_perimeter(coord C) {
	if (check_coord(C))
		return 0L;
	else
		return 2 * ((C.x1 - C.x0) + (C.y1 - C.y0));
}

bool check_interesect_rectangle(coord A, coord B) {
	if (A.x0 <= B.x0 && B.x0 <= A.x1 &&
		B.y0 <= A.y0 && A.y0 <= B.y1)
		return true;
	if (A.x0 <= B.x1 && B.x1 <= A.x1 &&
		B.y0 <= A.y0 && A.y0 <= B.y1)
		return true;
	if (B.x0 <= A.x0 && A.x0 <= B.x1 &&
		A.y0 <= B.y0 && B.y0 <= A.y1)
		return true;
	if (B.x0 <= A.x1 && A.x1 <= B.x1 &&
		A.y0 <= B.y0 && B.y0 <= A.y1)
		return true;
	return false;
}

int main() {
	read();
	AB = intersect_rectangle(A, B);
	BC = intersect_rectangle(B, C);
	AC = intersect_rectangle(A, C);
	ABC = intersect_rectangle(A, BC);

	ll area = compute_area(A) + compute_area(B) + compute_area(C)
			- compute_area(AB) - compute_area(BC) - compute_area(AC) +
			compute_area(ABC),
	perimeter = compute_perimeter(A) +  compute_perimeter(B) + compute_perimeter(C)
				-compute_perimeter(AB) - compute_perimeter(BC) - compute_perimeter(AC) +
				compute_perimeter(ABC);
	printf("%lld %lld\n", area, perimeter);
}