Cod sursa(job #265467)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 23 februarie 2009 22:22:00
Problema Reuniune Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <cstdlib>
#include <algorithm>

using namespace std;

#define pii 	pair<int,int>
#define ff	first
#define ss	second

pii Sus[4], Jos[4];
long long arie, perimetru;
void getArie( int x ) {
	arie += 1LL * (Sus[x].ff - Jos[x].ff) * (Sus[x].ss - Jos[x].ss);
	perimetru += (2LL * (Sus[x].ff - Jos[x].ff) + 2LL * (Sus[x].ss - Jos[x].ss));
}
void getArie2( int x, int y ) {
	pii minI, maxI;
	minI.ff = max(Jos[x].ff, Jos[y].ff);
	minI.ss = max(Jos[x].ss, Jos[y].ss);
	
	maxI.ff = min(Sus[x].ff, Sus[y].ff);
	maxI.ss = min(Sus[x].ss, Sus[y].ss);
	
	if (minI.ff <= maxI.ff && minI.ss <= maxI.ss) {
		arie -= (maxI.ff - minI.ff) * (maxI.ss - minI.ss);
		perimetru -= (2LL * (maxI.ff - minI.ff) + 2LL * (maxI.ss - minI.ss));
	}
}

void getArie3( ) {
	pii minI, maxI;
	minI.ff = max(Jos[3].ff, max(Jos[1].ff, Jos[2].ff));
	minI.ss = max(Jos[3].ss, max(Jos[1].ss, Jos[2].ss));
	
	maxI.ff = min(Sus[3].ff, min(Sus[1].ff, Sus[2].ff));
	maxI.ss = min(Sus[3].ss, min(Sus[1].ss, Sus[2].ss));
	
	if (minI.ff <= maxI.ff && minI.ss <= maxI.ss){
		arie += (maxI.ff - minI.ff) * (maxI.ss - minI.ss);
		perimetru += (2LL * (maxI.ff - minI.ff) + 2LL * (maxI.ss - minI.ss));
	}
}
void solve( ) {
	int i, j;
	getArie(1); getArie(2); getArie(3);
	for (i = 1; i < 3; ++ i)
		for (j = i + 1; j < 4; ++j){
			getArie2(i, j);
		}
	getArie3();
}

int main( ) {

#ifndef DEBUG
	freopen("reuniune.in", "r", stdin);
	freopen("reuniune.out", "w", stdout);
#endif
	scanf("%d%d%d%d", &Jos[1].ff, &Jos[1].ss, &Sus[1].ff, &Sus[1].ss);
	scanf("%d%d%d%d", &Jos[2].ff, &Jos[2].ss, &Sus[2].ff, &Sus[2].ss);
	scanf("%d%d%d%d", &Jos[3].ff, &Jos[3].ss, &Sus[3].ff, &Sus[3].ss);
	
	solve();	
	
	printf("%lld %lld\n", arie, perimetru);
}