Cod sursa(job #185739)

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

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

void citire();
void rezolva();
long long ari(int,int,int);
long long per(int,int,int);
long long min(long long ,long long );
long long max(long long ,long long );
void afiseaza();

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

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

void rezolva() {
     arie+=ari(1,1,1)+ari(2,2,2)+ari(3,3,3)-ari(1,2,2)-ari(1,3,3)-ari(2,3,3)+ari(1,2,3);
     perim+=per(1,1,1)+per(2,2,2)+per(3,3,3)-per(1,2,2)-per(1,3,3)-per(2,3,3)+per(1,2,3);
}

long long ari(int k,int l, int m)
{long long x1,x2,y1,y2;
     x1=max(max(p[k][0],p[l][0]),p[m][0]);
     x2=min(min(p[k][2],p[l][2]),p[m][2]);
     y1=max(max(p[k][1],p[l][1]),p[m][1]);
     y2=min(min(p[k][3],p[l][3]),p[m][3]);
     if (x2>=x1 && y2>=y1)
	return (x2-x1)*(y2-y1);
     else
	return 0;
}
long long per(int k,int l,int m)
{long long x1,x2,y1,y2;
	x1=max(max(p[k][0],p[l][0]),p[m][0]);
	x2=min(min(p[k][2],p[l][2]),p[m][2]);
	y1=max(max(p[k][1],p[l][1]),p[m][1]);
	y2=min(min(p[k][3],p[l][3]),p[m][3]);
	if (x2>=x1 && y2>=y1)
		return 2*(x2+y2-x1-y1);
	else	return 0;

}

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