Cod sursa(job #1138781)

Utilizator raulstoinStoin Raul raulstoin Data 10 martie 2014 16:19:03
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include<fstream>

using namespace std;

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

struct Point
{
	long long x,y;
	void insert(int a,int b)
	{
		x=a;
		y=b;
	}
};

struct Dr
{
	Point Ld,Lu,Rd,Ru;
	void setx(int xl,int xr)
	{
		Ld.x=Lu.x=xl;
		Rd.x=Ru.x=xr;
	}
	void sety(int yd,int yu)
	{
		Ld.y=Rd.y=yd;
		Lu.y=Ru.y=yu;
	}
	
}v[7];

bool use[7][7],sw;

void intersectie(Dr a,Dr b,int i,int j,Dr &loc)
{
	v[4]=loc;
	use[i][j]=use[j][i]=1;
	//b inclus in a
	if(a.Lu.x<=b.Lu.x && b.Ru.x<=a.Ru.x)
	{
		loc.setx(b.Lu.x,b.Ru.x);
		if(b.Lu.y<=a.Lu.y)
		{
			if(a.Ld.y<=b.Ld.y)
				loc.sety(b.Ld.y,b.Lu.y);
			else
				loc.sety(a.Ld.y,b.Lu.y);
		}
		else
		{
			if(a.Ld.y<=b.Ld.y)
				loc.sety(b.Ld.y,a.Lu.y);
			else
				loc.sety(a.Ld.y,a.Lu.y);
		}
		return;
	}
	//b inclus partial, iese in stanga
	if(a.Lu.x>b.Lu.x && b.Ru.x<=a.Ru.x)
	{
		loc.setx(a.Lu.x,b.Ru.x);
		if(b.Lu.y<=a.Lu.y)
		{
			if(a.Ld.y<=b.Ld.y)
				loc.sety(b.Ld.y,b.Lu.y);
			else
				loc.sety(a.Ld.y,b.Lu.y);
		}
		else
		{
			if(a.Ld.y<=b.Ld.y)
				loc.sety(b.Ld.y,a.Lu.y);
			else
				loc.sety(a.Ld.y,a.Lu.y);
		}
		return;
	}
	//b inclus partial, iese in dreapta
	if(a.Lu.x<=b.Lu.x && b.Ru.x>a.Ru.x)
	{
		loc.setx(b.Lu.x,a.Ru.x);
		if(b.Lu.y<=a.Lu.y)
		{
			if(a.Ld.y<=b.Ld.y)
				loc.sety(b.Ld.y,b.Lu.y);
			else
				loc.sety(a.Ld.y,b.Lu.y);
		}
		else
		{
			if(a.Ld.y<=b.Ld.y)
				loc.sety(b.Ld.y,a.Lu.y);
			else
				loc.sety(a.Ld.y,a.Lu.y);
		}
		return;
	}
	//posibil a inclus complet in b
	if(b.Lu.x<a.Lu.x && b.Ru.x>a.Ru.x)
		return intersectie(b,a,j,i,loc);
	use[i][j]=use[j][i]=0;
	
}

long long perimetru,arie;

int main()
{
	for(int i=1,xd,yd,xu,yu;i<=3;i++)
	{
		fin>>xd>>yd>>xu>>yu;
		v[i].Ld.insert(xd,yd);
		v[i].Lu.insert(xd,yu);
		v[i].Rd.insert(xu,yd);
		v[i].Ru.insert(xu,yu);
		perimetru+=2*((yu-yd)+(xu-xd));
		arie+=(yu-yd)*(xu-xd);
	}
	for(int i=1;i<=2;i++)
		for(int j=i+1;j<=3;j++)
		{
			intersectie(v[i],v[j],i,j,v[5]);
			if(use[i][j])
			{
				perimetru-=(2*((v[5].Ru.x-v[5].Lu.x)+(v[5].Ru.y-v[5].Rd.y)));
				arie-=(v[5].Ru.x-v[5].Lu.x)*(v[5].Ru.y-v[5].Rd.y);
			}
			else
				sw=1;
		}
	if(!sw)
	{
		intersectie(v[4],v[5],4,5,v[6]);
		perimetru+=(2*((v[6].Ru.x-v[6].Lu.x)+(v[6].Ru.y-v[6].Rd.y)));
		arie+=(v[6].Ru.x-v[6].Lu.x)*(v[6].Ru.y-v[6].Rd.y);
	}
	
	fout<<arie<<' '<<perimetru;
	return 0;
}