Cod sursa(job #379393)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 1 ianuarie 2010 16:13:13
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
#include<stdio.h>
struct ok
{
    long x1,y1,x2,y2;
} a[4],tr;
long  mod (long x)
{
    if(x<0)
        return -x;
    return x;
}
long  max (long  x,long  y)
{
    if(x<y)
        return y;
    return x;
}
long  arie (ok n,ok m)
{
    if(n.x1<=m.x1 && m.x2<=n.x2 && n.y1<=m.y1 && m.y2<=n.y2)
        return mod(m.x1-m.x2)*mod(m.y1-m.y2);

    if(n.x1<=m.x1 && m.x2<=n.x2 && n.y1<=m.y1 && m.y1<=n.y2)
        return mod(m.x1-m.x2)*mod(m.y1-n.y2);

    if(n.x1<=m.x1 && m.x2<=n.x2 && n.y1<=m.y2 && m.y2<=n.y2)
        return mod(m.x1-m.x2)*mod(m.y2-n.y1);

    if(n.y1<=m.y1 && m.y2<=n.y2 && n.x1<=m.x1 && m.x1<=n.x2)
        return mod(m.x1-n.x2)*mod(m.y2-m.y1);

    if(n.y1<=m.y1 && m.y2<=n.y2 && n.x1<=m.x2 && m.x2<=n.x2)
        return mod(m.x2-n.x1)*mod(m.y2-m.y1);

    if(n.x1<=m.x2 && m.x2<=n.x2 && n.y1<=m.y2 && m.y2<=n.y2)
        return mod(n.x1-m.x2)*mod(n.y1-m.y2);

    if(n.x1<=m.x1 && m.x1<=n.x2 && n.y1<=m.y1 && m.y1<=n.y2)
        return mod(n.x2-m.x1)*mod(m.y1-n.y2);

    if(n.x1<=m.x2 && m.x2<=n.x2 && n.y1<=m.y1 && m.y1<=n.y2)
        return mod(n.x1-m.x2)*mod(n.y2-m.y1);

    if(n.x1<=m.x1 && m.x1<=n.x2 && n.y1<=n.y2 && n.y2<=m.y2)
        return mod(n.x2-m.x1)*mod(n.y1-m.y2);
    return 0;
}
long  solve1 ()
{
    long  d,b,c,s;
    s=0;
    b=max(arie(a[1],a[3]),arie(a[3],a[1]));
    c=max(arie(a[2],a[3]),arie(a[3],a[2]));
    d=max(arie(a[1],a[2]),arie(a[2],a[1]));
    if(d<=b && d<=c)
        s=b+c;
    else if (b<=d && b<=c)
            s=d+c;
        else if (c<=b && c<=d)
                s=d+b;
    s=-s;
    for(int i=1;i<=3;++i)
        s+=mod(a[i].x1-a[i].x2)*mod(a[i].y1-a[i].y2);
    printf("%ld ",s);
}
long  perim (ok n,ok m)
{
    if(n.x1<=m.x1 && m.x2<=n.x2 && n.y1<=m.y1 && m.y2<=n.y2)
        return 2*(mod(m.x1-m.x2)+mod(m.y1-m.y2));
    if(n.x1<=m.x1 && m.x2<=n.x2 && n.y1<=m.y1 && m.y1<=n.y2)
        return 2*(mod(m.x1-m.x2)+mod(m.y1-n.y2));
	if(n.x1<=m.x1 && m.x2<=n.x2 && n.y1<=m.y2 && m.y2<=n.y2)
		return 2*(mod(m.x1-m.x2)+mod(m.y2-n.y1));
	if(n.y1<=m.y1 && m.y2<=n.y2 && n.x1<=m.x1 && m.x1<=n.x2)
		return 2*(mod(m.x1-n.x2)+mod(m.y2-m.y1));
	if(n.y1<=m.y1 && m.y2<=n.y2 && n.x1<=m.x2 && m.x2<=n.x2)
		return 2*(mod(m.x2-n.x1)+mod(m.y2-m.y1));
    if(n.x1<=m.x2 && m.x2<=n.x2 && n.y1<=m.y2 && m.y2<=n.y2)
        return 2*(mod(n.x1-m.x2)+mod(n.y1-m.y2));
    if(n.x1<=m.x1 && m.x1<=n.x2 && n.y1<=m.y1 && m.y1<=n.y2)
        return 2*(mod(n.x2-m.x1)+mod(m.y1-n.y2));
    if(n.x1<=m.x2 && m.x2<=n.x2 && n.y1<=m.y1 && m.y1<=n.y2)
        return 2*(mod(n.x1-m.x2)+mod(n.y2-m.y1));
    if(n.x1<=m.x1 && m.x1<=n.x2 && n.y1<=n.y2 && n.y2<=m.y2)
        return 2*(mod(n.x2-m.x1)+mod(n.y1-m.y2));
	return 0;
}
long  solve2 ()
{
    long  d,b,c,s;
    s=0;
    b=max(perim(a[1],a[3]),perim(a[3],a[1]));
    c=max(perim(a[2],a[3]),perim(a[3],a[2]));
    d=max(perim(a[1],a[2]),perim(a[2],a[1]));
	if(d<=b && d<=c)
        s=b+c;
    else if (b<=d && b<=c)
            s=d+c;
        else if (c<=b && c<=d)
                s=d+b;
    s=-s;
    for(int i=1;i<=3;++i)
        s+=2*(mod(a[i].x1-a[i].x2)+mod(a[i].y1-a[i].y2));
    printf("%ld",s);
}
int main ()
{
    freopen("reuniune.in","r",stdin);
    freopen("reuniune.out","w",stdout);
    for(int i=1;i<=3;++i)
        scanf("%ld%ld%ld%ld",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
    solve1();
    solve2();
    return 0;
}