Cod sursa(job #783015)

Utilizator ChallengeMurtaza Alexandru Challenge Data 1 septembrie 2012 23:06:37
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>

using namespace std;

const char InFile[]="reuniune.in";
const char OutFile[]="reuniune.out";

ifstream fin(InFile);
ofstream fout(OutFile);

struct Interval
{
	Interval(long long min=0, long long max=0):min(min),max(max){Check();}

	void Check()
	{
		if(min>max)
		{
			swap(min,max);
		}
	}

	inline long long Length()
	{
		return max-min;
	}

	inline void Intersect(const Interval &inter)
	{
		min=::max(min,inter.min);
		max=::min(max,inter.max);
	}

	long long min,max;
};

struct AABB
{
	AABB(Interval X=Interval(), Interval Y=Interval()):X(X),Y(Y){}
	Interval X,Y; 

	inline long long Area()
	{
		if(X.min>X.max || Y.min>Y.max)
		{
			return 0;
		}
		return X.Length()*Y.Length();
	}

	inline long long Perimeter()
	{
		if(X.min>X.max || Y.min>Y.max)
		{
			return 0;
		}
		return (X.Length()+Y.Length())<<1;
	}

	inline void Intersect(const AABB &rect)
	{
		X.Intersect(rect.X);
		Y.Intersect(rect.Y);
	}
};

long long X0,Y0,X1,Y1;

int main()
{
	fin>>X0>>Y0>>X1>>Y1;
	AABB A(Interval(X0,X1),Interval(Y0,Y1));
	fin>>X0>>Y0>>X1>>Y1;
	AABB B(Interval(X0,X1),Interval(Y0,Y1));
	fin>>X0>>Y0>>X1>>Y1;
	AABB C(Interval(X0,X1),Interval(Y0,Y1));
	fin.close();

	AABB AB=A;
	AB.Intersect(B);
	AABB BC=B;
	BC.Intersect(C);
	AABB CA=C;
	CA.Intersect(A);
	AABB ABC=AB;
	ABC.Intersect(C);
	
	fout<<A.Area()+B.Area()+C.Area()-AB.Area()-BC.Area()-CA.Area()+ABC.Area()<<" ";
	fout<<A.Perimeter()+B.Perimeter()+C.Perimeter()-AB.Perimeter()-BC.Perimeter()-CA.Perimeter()+ABC.Perimeter();
	fout.close();
	return 0;
}