Cod sursa(job #379238)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 31 decembrie 2009 10:24:06
Problema Reuniune Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <math.h>

long long max(long long a,long long b)
{
	if (a>b) return a;
	return b;
}

long long min(long long a,long long b)
{
	if (a<b) return a;
	return b;
}

int x,y,z;

int main()
{
	long long i,j,k,l;
	long long x0[4],y0[4],x1[4],y1[4];
	long long a,p;

	freopen("reuniune.in","r",stdin);
	freopen("reuniune.out","w",stdout);

	for (i=0;i<3;i++)
	scanf("%ld%ld%ld%ld",&x0[i],&y0[i],&x1[i],&y1[i]);

	a=(x1[0]-x0[0])*(y1[0]-y0[0]);
	a+=(x1[1]-x0[1])*(y1[1]-y0[1]);
	a+=(x1[2]-x0[2])*(y1[2]-y0[2]);
	p=2*(x1[0]-x0[0]+y1[0]-y0[0]);
	p+=2*(x1[1]-x0[1]+y1[1]-y0[1]);
	p+=2*(x1[2]-x0[2]+y1[2]-y0[2]);

	if ((max(x0[0],x0[1])<min(x1[0],x1[1]))&&(max(y0[0],y0[1])<min(y1[0],y1[1])))
	{
		a-=(min(x1[0],x1[1])-max(x0[0],x0[1]))*(min(y1[0],y1[1])-max(y0[0],y0[1]));
		p-=2*(min(x1[0],x1[1])-max(x0[0],x0[1])+min(y1[0],y1[1])-max(y0[0],y0[1]));
		x=1;
		i=min(x1[0],x1[1]);
		j=max(x0[0],x0[1]);
		k=min(y1[0],y1[1]);
		l=max(y0[0],y0[1]);
	}

	if ((max(x0[2],x0[1])<min(x1[2],x1[1]))&&(max(y0[2],y0[1])<min(y1[2],y1[1])))
	{
		a-=(min(x1[2],x1[1])-max(x0[2],x0[1]))*(min(y1[2],y1[1])-max(y0[2],y0[1]));
		p-=2*(min(x1[2],x1[1])-max(x0[2],x0[1])+min(y1[2],y1[1])-max(y0[2],y0[1]));
		y=1;
	}

	if ((max(x0[0],x0[2])<min(x1[0],x1[2]))&&(max(y0[0],y0[2])<min(y1[0],y1[2])))
	{
		a-=(min(x1[0],x1[2])-max(x0[0],x0[2]))*(min(y1[0],y1[2])-max(y0[0],y0[2]));
		p-=2*(min(x1[0],x1[2])-max(x0[0],x0[2])+min(y1[0],y1[2])-max(y0[0],y0[2]));
		z=1;
	}
	if ((x==1)&&(y==1)&&(z==1))
	{
		a+=(min(x1[2],i)-max(x0[2],j))*(min(y1[2],k)-max(y0[2],l));
		p+=2*(min(x1[2],i)-max(x0[2],j)+min(y1[2],k)-max(y0[2],l));
	}
	printf("%lld%c%lld",a,' ',p);
	return 0;
}