Cod sursa(job #267971)

Utilizator tvladTataranu Vlad tvlad Data 28 februarie 2009 16:12:35
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <fstream>
#include <cassert>
using namespace std;

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

struct interval {
	long long a,b;
	long long length() { return b-a; };
};
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 (x->a > y->a) {
		interval *aux = x;
		x = y;
		y = aux;
	}
	interval r;
	if (y->a > x->b) {
		r.a = 1;
		r.b = 0;
	} else
	if (y->b <= x->b) {
		r.a = y->a;
		r.b = y->b;
	} else
	if (x->a < y->a && y->a < x->b) {
		r.a = y->a;
		r.b = x->b;
	} else {
		r.a = y->a;
		r.b = y->a;
	}
	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; };
	long long area() {
		if (x.length() < 0 || y.length() < 0) return 0;
		return x.length()*y.length();
	};
	long long perimeter() {
		if (x.length() < 0 || y.length() < 0) return 0;
		return x.length()*2 + y.length()*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;
	if (a.x.length() < 0 || a.y.length() < 0 || b.x.length() < 0 || b.x.length() < 0) {
		r.x.a = 1;
		r.x.b = 0;
		r.y = r.x;
	} else {
		r.x = a.x + b.x;
		r.y = a.y + b.y;
	}
	return r;
};

int 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;
}