Cod sursa(job #603932)

Utilizator vlad2901Vlad Berindei vlad2901 Data 19 iulie 2011 14:09:53
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <math.h>

struct dr
{
    int sx, sy, jx, jy;
};

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

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

long long abs(long long a)
{
    if(a<0)
    {
        return -a;
    }
    return a;
}

dr inter(dr d1, dr d2)
{
    dr rez;
    if((d2.sx >= d1.jx || d2.sy <= d1.jy) || d2.jx <= d1.sx || d2.jy >= d1.sy)
    {
        rez.sx = rez.sy = rez.jx = rez.jy = 0;
        return rez;
    }

    rez.sx = max(d1.sx, d2.sx);
    rez.sy = min(d1.sy, d2.sy);
    rez.jx = min(d1.jx, d2.jx);
    rez.jy = max(d1.jy, d2.jy);

    return rez;

}

long long aria(dr d)
{
    long long a;
    a = abs((long long)(d.sx - d.jx) * (d.sy - d.jy));
    return a;
}

long long perim(dr d)
{
    long long p;
    p = 2LL * ((long long)(d.sy - d.jy) + (d.jx - d.sx));
    return p;
}

int main()
{
    dr d[3];
    int i;
    long long p, a;

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

    for(i=0;i<3;++i)
    {
        scanf("%d %d %d %d", &d[i].sx, &d[i].jy, &d[i].jx, &d[i].sy);
    }

    a = aria(d[0])
        + aria(d[1])
        + aria(d[2])
        - aria(inter(d[0], d[1]))
        - aria(inter(d[1], d[2]))
        - aria(inter(d[2], d[0]))
        + aria(inter(d[0],inter(d[1], d[2])));

    p = perim(d[0])
        + perim(d[1])
        + perim(d[2])
        - perim(inter(d[0], d[1]))
        - perim(inter(d[1], d[2]))
        - perim(inter(d[2], d[0]))
        + perim(inter(d[0],inter(d[1], d[2])));

    printf("%lld %lld", a, p);

    return 0;
}