Cod sursa(job #1138816)

Utilizator raulstoinStoin Raul raulstoin Data 10 martie 2014 16:58:47
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.44 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];

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 && b.Lu.y>=a.Ld.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);
		}
		if(b.Lu.y>a.Lu.y && b.Ld.y<=a.Lu.y)
		{
			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 && b.Ru.x>=a.Lu.x)
	{
		loc.setx(a.Lu.x,b.Ru.x);
		if(b.Lu.y<=a.Lu.y && b.Lu.y>=a.Ld.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);
		}
		if(b.Lu.y>a.Lu.y && b.Ld.y<=a.Lu.y)
		{
			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 && b.Lu.x<=a.Ru.x)
	{
		loc.setx(b.Lu.x,a.Ru.x);
		if(b.Lu.y<=a.Lu.y && b.Lu.y>=a.Ld.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);
		}
		if(b.Lu.y>a.Lu.y && b.Ld.y<=a.Lu.y)
		{
			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,sw;

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);
		arie+=1LL*(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-=1LL*(v[5].Ru.x-v[5].Lu.x)*(v[5].Ru.y-v[5].Rd.y);
				sw++;
			}
		}
	
	if(sw>1)
	{
		intersectie(v[4],v[5],4,5,v[6]);
		arie+=1LL*(v[6].Ru.x-v[6].Lu.x)*(v[6].Ru.y-v[6].Rd.y);
		
		long long minx=(1<<30),maxx=-(1<<30),miny=(1<<30),maxy=-(1<<30);
		for(int i=1;i<=3;i++)
		{
			minx=min(minx,v[i].Lu.x);
			maxx=max(maxx,v[i].Ru.x);
			miny=min(miny,v[i].Ld.y);
			maxy=max(maxy,v[i].Lu.y);
		}
		perimetru=1LL*2*((maxx-minx)+(maxy-miny));
	}
	if(sw==1)
	{
		int Xor=0;
		long long minx=(1<<30),maxx=-(1<<30),miny=(1<<30),maxy=-(1<<30);
		for(int i=1;i<=2;i++)
			for(int j=i+1;j<=3;j++)
				if(use[i][j])
				{
					minx=min(minx,v[i].Lu.x);
					maxx=max(maxx,v[i].Ru.x);
					miny=min(miny,v[i].Ld.y);
					maxy=max(maxy,v[i].Lu.y);
					
					minx=min(minx,v[j].Lu.x);
					maxx=max(maxx,v[j].Ru.x);
					miny=min(miny,v[j].Ld.y);
					maxy=max(maxy,v[j].Lu.y);
					
					perimetru=1LL*2*((maxx-minx)+(maxy-miny));
					Xor=i^j;
				}
		perimetru+=1LL*2*((v[Xor].Ru.x-v[Xor].Lu.x)+(v[Xor].Ru.y-v[Xor].Rd.y));
	}
	if(sw==0)
		for(int i=1;i<=3;i++)
			perimetru+=1LL*2*((v[i].Ru.x-v[i].Lu.x)+(v[i].Ru.y-v[i].Rd.y));
	
	fout<<arie<<' '<<perimetru;
	return 0;
}