Cod sursa(job #521641)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 12 ianuarie 2011 23:48:55
Problema Reuniune Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <math.h>
#define ll long long

struct drept {
	int x0,y0,x1,y1;
};
int i,j,nri;
drept D[10];
double A1,A2,A3,At,A[10];
ll Pt,P[10];
bool trei=true;

void citire()
{
	for(i=1;i<=3;i++)
		scanf("%d %d %d %d",&D[i].x0,&D[i].y0,&D[i].x1,&D[i].y1);
}

int max(int a, int b)
{
	if(a>b) return a;
	return b;
}
int min(int a, int b)
{
	if(a<b) return a;
	return b;
}

void arii_perimetre()
{
	double L1,L2;
	for(i=1;i<=3;i++)
	{
		L1=D[i].x1-D[i].x0; L2=D[i].y1-D[i].y0; 
		A[i]=L1*L2; P[i]=2*(ll)((ll)L1+(ll)L2);
	}
	nri=3;
}


void intersectii()
{
	int L1,L2,ix0,iy0,ix1,iy1;

	for(i=1;i<=2;i++)
		for(j=i+1;j<=3;j++)
	{
	ix0=max(D[i].x0,D[j].x0); iy0=max(D[i].y0,D[j].y0);
	ix1=min(D[i].x1,D[j].x1); iy1=min(D[i].y1,D[j].y1);
	L1=ix1-ix0; L2=iy1-iy0;
	if(L1*L2>0) 
	{
		A[++nri]=L1*L2;
		P[nri]=2*(ll)((ll)L1+(ll)L2);
	}
	if(L1*L2==0)
	{
		P[++nri]=2*(ll)((ll)L1+(ll)L2);
		trei=false;
	}
	}
	
	if(trei)
	{
		ix0=max(ix0,D[1].x0); iy0=max(iy0,D[1].y0);
		ix1=min(ix1,D[1].x1); iy1=min(iy1,D[1].y1);
		L1=ix1-ix0; L2=iy1-iy0;
		if(L1*L2>0) 
		{
			A[++nri]=L1*L2;
			P[nri]=2*(ll)((ll)L1+(ll)L2);
		}
	}
}

void pinex()
{
	At=A[1]+A[2]+A[3];
	Pt=P[1]+P[2]+P[3];
	for(i=4;i<=6;i++)
	{
		At-=A[i];
		Pt-=P[i];
	}
	At+=A[7]; Pt+=P[7];
}

int main()
{
	freopen("reuniune.in","r",stdin);
	freopen("reuniune.out","w",stdout);
	citire();
	arii_perimetre();
	intersectii();
	pinex();
	printf("%.0f %lld",At,Pt);
}