Cod sursa(job #267948)

Utilizator tvladTataranu Vlad tvlad Data 28 februarie 2009 15:50:22
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 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 = r.b = 0;
	} else
	if (y->b <= x->b) {
		r.a = y->a;
		r.b = y->b;
	} else {
		r.a = y->a;
		r.b = x->b;
	}
	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() {
		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);
	if (r.x.length() == 0) r.y.a = r.y.b = 0;
	if (r.y.length() == 0) r.x.a = r.x.b = 0;
	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;
}