Cod sursa(job #379866)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 4 ianuarie 2010 12:09:31
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<stdio.h>
struct punct
{
    long long x,y;
};
struct dreptunghi
{
    punct ss,dj;
} a[4],drpt12,drpt23,drpt13,drpt123;
long long arie,perimetru;
long long mod(long long x)
{
    if(x<0)
	return x;
    return x;
}
long long max (long long a,long long b)
{
    if(a<b)
	return b;
    return a;
}
long long min (long long a,long long b)
{
    if(a>b)
	return b;
    return a;
}
int intersect (dreptunghi r1,dreptunghi r2)
{
    return r1.dj.x>=r2.ss.x && r1.ss.x<=r2.dj.x && r1.dj.y<=r2.ss.y && r1.ss.y>=r2.dj.y;
}
punct stanga_sus (dreptunghi r1,dreptunghi r2)
{
    punct A;
    A.x=max(r1.ss.x,r2.ss.x);
    A.y=min(r1.ss.y,r2.ss.y);
    return A;
}
punct dreapta_jos (dreptunghi r1,dreptunghi r2)
{
    punct A;
    A.x=min(r1.dj.x,r2.dj.x);
    A.y=max(r1.dj.y,r2.dj.y);
    return A;
}
long long Aria (dreptunghi A)
{
    return (A.dj.x-A.ss.x)*(A.ss.y-A.dj.y);
}
long long  perim (dreptunghi A)
{
    return 2*(A.dj.x-A.ss.x+A.ss.y-A.dj.y);
}
int main ()
{

	freopen("reuniune.in","r",stdin);
    freopen("reuniune.out","w",stdout);
    for(int i=1;i<=3;++i)
	scanf("%lld%lld%lld%lld",&a[i].ss.x,&a[i].dj.y,&a[i].dj.x,&a[i].ss.y);
    if(intersect(a[1],a[2]))
    {
	drpt12.ss=stanga_sus(a[1],a[2]);
	drpt12.dj=dreapta_jos(a[1],a[2]);
    }

    if(intersect(a[1],a[2]))
    {
	drpt23.ss=stanga_sus(a[2],a[3]);
	drpt23.dj=dreapta_jos(a[2],a[3]);
    }

    if(intersect(a[1],a[2]))
    {
	drpt13.ss=stanga_sus(a[1],a[3]);
	drpt13.dj=dreapta_jos(a[1],a[3]);
    }

    if(intersect(a[1],a[2]))
    {
	drpt123.ss=stanga_sus(a[1],drpt23);
	drpt123.dj=dreapta_jos(a[1],drpt23);
    }
    arie=Aria(a[1])+Aria(a[2])+Aria(a[3])-Aria(drpt12)-Aria(drpt23)-Aria(drpt13)+Aria(drpt123);
    perimetru=perim(a[1])+perim(a[2])+perim(a[3])-perim(drpt12)-perim(drpt23)-perim(drpt13)+perim(drpt123);
    printf("%lld %lld",arie,perimetru);
    return 0;
}