Cod sursa(job #2585796)

Utilizator antoniu200Alexa Sergiu antoniu200 Data 19 martie 2020 13:41:27
Problema Reuniune Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>
#include <cmath>
#include <algorithm>

using namespace std;

ifstream cin("reuniune.in");
ofstream cout("reuniune.out");

struct coord_rectangle {
	long long start_col, start_lin;
	long long end_col, end_lin;
};

coord_rectangle make_rectangle(long long start_col, long long start_lin, long long end_col, long long end_lin) {
	coord_rectangle k;
	k.start_col = start_col;
	k.start_lin = start_lin;
	k.end_col = end_col;
	k.end_lin = end_lin;
	return k;
}

istream &operator>>(istream &input, coord_rectangle &a) {
	input >> a.start_col >> a.start_lin >> a.end_col >> a.end_lin;
	return input;
}

long long calculate_area(coord_rectangle a) {
	return 1ll * (a.end_col - a.start_col) * (a.end_lin - a.start_lin);
}

long long calculate_perimeter(coord_rectangle a) {
	return 2ll * (a.end_col - a.start_col) + 2ll * (a.end_lin - a.start_lin);
}

coord_rectangle find_reunion(coord_rectangle a, coord_rectangle b) {
    coord_rectangle x;
    x.start_col = max(a.start_col, b.start_col);
    x.start_lin = max(a.start_lin, b.start_lin);
    x.end_col = min(a.end_col, b.end_col);
    x.end_lin = min(a.end_lin, b.end_lin);
    x.start_col = min(x.start_col, x.end_col);
    x.start_lin = min(x.start_lin, x.end_lin);
    return x;
}

int main()
{
	coord_rectangle input_data[3] = {make_rectangle(0, 0, 0, 0)};
	cin >> input_data[0] >> input_data[1] >> input_data[2];

	cout << calculate_area(input_data[0]) + calculate_area(input_data[1]) + calculate_area(input_data[2]) - calculate_area(find_reunion(input_data[0], input_data[1])) - calculate_area(find_reunion(input_data[0], input_data[2])) - calculate_area(find_reunion(input_data[1], input_data[2])) + calculate_area(find_reunion(find_reunion(input_data[0], input_data[1]), input_data[2])) << " ";

	long long perimeter = calculate_perimeter(input_data[0]);
	perimeter += calculate_perimeter(input_data[1]);
	perimeter += calculate_perimeter(input_data[2]);
	perimeter -= calculate_perimeter(find_reunion(input_data[0], input_data[1]));
	perimeter -= calculate_perimeter(find_reunion(input_data[0], input_data[2]));
	perimeter -= calculate_perimeter(find_reunion(input_data[1], input_data[2]));
	perimeter += calculate_perimeter(find_reunion(find_reunion(input_data[0], input_data[1]), input_data[2]));
	cout << perimeter;
}