Cod sursa(job #1471382)

Utilizator andreipnAndrei Petre andreipn Data 13 august 2015 18:09:48
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
//http://www.infoarena.ro/problema/Reuniune
#include <iostream>
#include <algorithm>
#include <list>
#include <fstream>

using namespace std;

class Dreptunghi {
public:
	long long int x0, y0, x1, y1;
	long long int dx, dy;

	Dreptunghi(): x0(0), y0(0), x1(0), y1(0) {
		dx = dy = 0;
	}
	Dreptunghi(long long int x0, long long int y0, long long int x1, long long int y1): x0(x0), y0(y0), x1(x1), y1(y1) {
		dx = abs(x1 - x0);
		dy = abs(y1 - y0);
	}

	long long int perimetru() {
		return 2 * (x1 - x0 + y1 - y0);
	}

	long long int arie() {
		return (x1 - x0) * (y1 - y0);
	}
	
	Dreptunghi intersectie(Dreptunghi o) {
		Dreptunghi i;
		i.x0 = max(o.x0, x0);
		i.y0 = max(o.y0, y0);
		i.x1 = min(o.x1, x1);
		i.y1 = min(o.y1, y1);

		if (i.x0 > i.x1 || i.y0 > i.y1)
			i.x0 = i.x1 = i.y0 = i.y1 = 0;
		return i;
	}

	friend ostream& operator<< (ostream &out, Dreptunghi &d) {
		out << "(" << d.x0 << "," << d.y0 << "),(" << d.x1 << "," << d.y1 << ")";
		return out;
	}
};

void arie_perimetru(Dreptunghi d1, Dreptunghi d2, Dreptunghi d3,
                    long long int &arie, long long int &perimetru) {

	Dreptunghi d12 = d1.intersectie(d2);
	Dreptunghi d13 = d1.intersectie(d3);
	Dreptunghi d23 = d2.intersectie(d3);
	Dreptunghi d123 = d23.intersectie(d1);

	arie = d1.arie() + d2.arie() + d3.arie() -
	       d12.arie() - d13.arie() - d23.arie() +
	       d123.arie();

	cout << d1.perimetru() << " " << d2.perimetru() << " " << d3.perimetru() << endl;
	cout << d12.perimetru() << " " << d23.perimetru() << " " << d13.perimetru() << endl;
	cout << d123.perimetru() << endl;

	cout << endl;
	cout << d1.arie() << " " << d2.arie() << " " << d3.arie() << endl;
	cout << d12.arie() << " " << d23.arie() << " " << d13.arie() << endl;
	cout << d123.arie() << endl;

	perimetru = d1.perimetru() + d2.perimetru() + d3.perimetru() -
	       d12.perimetru() - d13.perimetru() - d23.perimetru() +
	       d123.perimetru();
}

int main() {
	ifstream ifs("reuniune.in");
	if (!ifs) {
		cerr << "Err deschidere fisier" << endl;
		exit(1);
	}
	long long int x0, x1, y0, y1;
	long long int arie, perimetru;
	ifs >> x0 >> y0 >> x1 >> y1;
	Dreptunghi d1(x0, y0, x1, y1);
	ifs >> x0 >> y0 >> x1 >> y1;
	Dreptunghi d2(x0, y0, x1, y1);
	ifs >> x0 >> y0 >> x1 >> y1;
	Dreptunghi d3(x0, y0, x1, y1);

	// caz cand nu se ating niciunul dintre ele, reuniunea e vida.
	arie_perimetru(d1, d2, d3, arie, perimetru);
	ofstream ofs("reuniune.out");
	if (!ofs) {
		cerr << "Err deschidere fisier" << endl;
		exit(1);
	}
	ofs << arie << " " << perimetru;
	return 0;
}