Cod sursa(job #267942)

Utilizator tvladTataranu Vlad tvlad Data 28 februarie 2009 15:36:18
Problema Reuniune Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <cassert>
using namespace std;

ifstream fin("reuniune.in");
ofstream fout("reuniune.out");

struct interval { long long a,b; };
interval operator+ ( interval i1, interval i2 ) {
	if (i1.a > i1.b) i1.a ^= i1.b ^= i1.a ^= i1.b;
	if (i2.a > i2.b) i2.a ^= i2.b ^= i2.a ^= i2.b;
	interval *x = &i1, *y = &i2;
	if (i1.a > i2.a) {
		x = &i2;
		y = &i1;
	}
	interval r;
	if (x->a > y->b || y->a > x->b) {
		r.a = r.b = 0;
	} else
	if (x->a <= y->a && y->b <= x->b) {
		r.a = y->a;
		r.b = y->b;
	} else
	if (x->b - y->a < x->b - x->a && y->a - x->a < x->b - x->a) {
		r.a = y->a;
		r.b = x->b;
	} else {
		assert(false);
	}
	return r;
};

class dreptunghi {
	interval x, y;
	friend istream& operator>> ( istream& stream, dreptunghi& d );
	friend dreptunghi operator+ ( dreptunghi x, dreptunghi y );
public:
	dreptunghi() {};
	dreptunghi ( interval a, interval b ) { x = a; y = b; };
	dreptunghi ( long long x1, long long y1, long long x2, long long y2 ) {
		x.a = x1; x.b = x2; y.a = y1; y.b = y2;
		if (x.a > x.b) x.a ^= x.b ^= x.a ^= x.b;
		if (y.a > y.b) y.a ^= y.b ^= y.a ^= y.b;
	};
	long long area() {
		return (x.b - x.a)*(y.b - y.a);
	};
	long long perimeter() {
		return (x.b - x.a)*2 + (y.b - y.a)*2;
	};
};
istream& operator>> ( istream& stream, dreptunghi& d ) {
	stream >> d.x.a >> d.y.a >> d.x.b >> d.y.b;
	return stream;
};
dreptunghi operator+ ( dreptunghi a, dreptunghi b ) {
	dreptunghi r(a.x + b.x, a.y + b.y);
	return r;
};

long long main() {
	dreptunghi d1,d2,d3;
	fin >> d1 >> d2 >> d3;
	dreptunghi d12 = d1 + d2,d13 = d1 + d3,d23 = d2 + d3,d123 = d1 + d2 + d3;
	long long area = d1.area() + d2.area() + d3.area();
	area -= (d1+d2).area() + (d1+d3).area() + (d2+d3).area();
	area += (d1+d2+d3).area();
	long long perimeter = d1.perimeter() + d2.perimeter() + d3.perimeter();
	perimeter -= (d1+d2).perimeter() + (d1+d3).perimeter() + (d2+d3).perimeter();
	perimeter += (d1+d2+d3).perimeter();
	fout << area << ' ' << perimeter << '\n';
	return 0;
}