Cod sursa(job #848401)

Utilizator Athena99Anghel Anca Athena99 Data 5 ianuarie 2013 13:54:27
Problema Reuniune Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <cstdio>
#include <cassert>

long long max(long long k1,long long k2)
{
    if (k1>k2)
        return k1;
    else
        return k2;
}

long long min(long long k1,long long k2)
{
    if (k1<k2)
        return k1;
    else
        return k2;
}

int main()
{
    long long arie=0,perimetru=0,x=0,y=0,x1=0,x2=0,x3=0,x4=0,x5=0,x6=0,y1=0,y2=0,y3=0,y4=0,y5=0,y6=0;

    assert(freopen("reuniune.in","r",stdin));
    assert(freopen("reuniune.out","w",stdout));

    assert(scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2));
    assert(scanf("%lld%lld%lld%lld",&x3,&y3,&x4,&y4));
    assert(scanf("%lld%lld%lld%lld",&x5,&y5,&x6,&y6));

    arie=(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3)+(x6-x5)*(y6-y5);
    x=(min(min(x2,x4),x6)-max(max(x1,x3),x5))*(min(min(y2,y4),y6)-max(max(y1,y3),y5));

    perimetru=2*(x2+y2+x4+y4+x6+y6-x1-y1-x3-y3-x5-y5);
    y=2*((min(min(x2,x4),x6)-max(max(x1,x3),x5))+(min(min(y2,y4),y6)-max(max(y1,y3),y5)));

    if (x>0)
        arie+=x;
    x=0;
    if (min(x2,x4)>=max(x1,x3) && min(y2,y4)>=max(y3,y1))
        x=(min(x2,x4)-max(x1,x3))*(min(y2,y4)-max(y3,y1));
    if (min(x2,x6)>=max(x1,x5) && min(y2,y6)>=max(y1,y5))
        x=x+(min(x2,x6)-max(x1,x5))*(min(y2,y6)-max(y1,y5));
    if (min(x6,x4)>=max(x5,x3) && min(y6,y4)>=max(y3,y5))
        x=x+(min(x6,x4)-max(x5,x3))*(min(y6,y4)-max(y3,y5));
    arie-=x;

    if (y>0)
        perimetru+=y;
    y=0;
    if (min(x2,x4)>=max(x1,x3) && min(y2,y4)>=max(y3,y1))
        y=2*(min(x2,x4)-max(x1,x3)+min(y2,y4)-max(y3,y1));
    if (min(x2,x6)>=max(x1,x5) && min(y2,y6)>=max(y1,y5))
        y=y+2*(min(x2,x6)-max(x1,x5)+min(y2,y6)-max(y1,y5));
    if (min(x6,x4)>=max(x5,x3) && min(y6,y4)>=max(y3,y5))
        y=y+2*(min(x6,x4)-max(x5,x3)+min(y6,y4)-max(y3,y5));
    perimetru-=y;

    if (min(x2,x4)>max(x1,x3) && min(y2,y4)>max(y3,y1) && (min(x2,x6)<max(x1,x5) || min(y2,y6)<max(y1,y5) || min(x6,x4)<max(x5,x3) || min(y6,y4)<max(y3,y5)))
    {
        arie=arie-((x6-x5)*(y6-y5));
        perimetru=perimetru-(2*(x6+y6-x5-y5));
    }
    else if ((min(x2,x4)<max(x1,x3) || min(y2,y4)<max(y3,y1) || (min(x2,x6)<max(x1,x5) || min(y2,y6)<max(y1,y5)) && min(x6,x4)>max(x5,x3) && min(y6,y4)>max(y3,y5)))
    {
        arie=arie-((x2-x1)*(y2-y1));
        perimetru=perimetru-(2*(x2+y2-x1-y1));
    }
    else if ((min(x2,x4)<max(x1,x3) || min(y2,y4)<max(y3,y1) || min(x6,x4)<max(x5,x3) || min(y6,y4)<max(y3,y5)) && min(x2,x6)>max(x1,x5) && min(y2,y6)>max(y1,y5))
    {
        arie=arie-((x4-x3)*(y4-y3));
        perimetru=perimetru-(2*(x6+y6-x5-y5));
    }

    assert(printf("%lld %lld\n",arie,perimetru));

    return 0;
}