Cod sursa(job #185738)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 25 aprilie 2008 23:01:12
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<stdio.h>
#include<math.h>

long arie,perim,p[5][5];

void citire();
void rezolva();
int ar(int );
int per(int );
int inar(int,int);
int inari();
int inper(int,int);
int inperi();
int min(int,int);
int max(int,int);
void afiseaza();

int main()
{
    citire();
    rezolva();
    afiseaza();
    return 0;
}

void citire()
{
	freopen("reuniune.in","r",stdin);
     scanf("%ld %ld %ld %ld",&p[1][0],&p[1][1],&p[1][2],&p[1][3]);
     scanf("%ld %ld %ld %ld",&p[2][0],&p[2][1],&p[2][2],&p[2][3]);
     scanf("%ld %ld %ld %ld",&p[3][0],&p[3][1],&p[3][2],&p[3][3]);
}
void afiseaza()
{
	freopen("reuniune.out","w",stdout);
	printf("%ld %ld\n",arie,perim);
}

void rezolva() {
     arie+=ar(1)+ar(2)+ar(3);
     perim+=per(1)+per(2)+per(3);
     arie-=inar(1,2)+inar(1,3)+inar(2,3);
     perim-=inper(1,2)+inper(1,3)+inper(2,3);
     arie+=inari();
     perim+=inperi();
}

int ar(int k) {
    return (p[k][2]-p[k][0])*(p[k][3]-p[k][1]);
}

int per(int k) {
    return 2*(p[k][2]-p[k][0]+p[k][3]-p[k][1]);
}

int inar(int k,int l) {
int x1,x2,y1,y2;
    x2=min(p[k][2],p[l][2]);
    x1=max(p[k][0],p[l][0]);
    y2=min(p[k][3],p[l][3]);
    y1=max(p[k][1],p[l][1]);
    if (y2>=y1 && x2>=x1)
	    return (y2-y1)*(x2-x1);
    else	return 0;
}
int inari()
{int x1,x2,y1,y2;
     x1=max(max(p[1][0],p[2][0]),p[3][0]);
     x2=min(min(p[1][2],p[2][2]),p[3][2]);
     y1=max(max(p[1][1],p[2][1]),p[3][1]);
     y2=min(min(p[1][3],p[2][3]),p[3][3]);
     if (x2>=x1 && y2>=y1)
	return (x2-x1)*(y2-y1);
     else
	return 0;
}
int inper(int k,int l){
int x1,x2,y1,y2;
    x2=min(p[k][2],p[l][2]);
    x1=max(p[k][0],p[l][0]);
    y2=min(p[k][3],p[l][3]);
    y1=max(p[k][1],p[l][1]);
    if (y2>=y1 && x2>=x1)
	return 2*(y2-y1+x2-x1);
    else
	return 0;
}
int inperi()
{int x1,x2,y1,y2;
	x1=max(max(p[1][0],p[2][0]),p[3][0]);
	x2=min(min(p[1][2],p[2][2]),p[3][2]);
	y1=max(max(p[1][1],p[2][1]),p[3][1]);
	y2=min(min(p[1][3],p[2][3]),p[3][3]);
	if (x2>=x1 && y2>=y1)
		return 2*(x2+y2-x1-y1);
	else	return 0;

}

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