Cod sursa(job #1752896)

Utilizator antanaAntonia Boca antana Data 5 septembrie 2016 14:34:17
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <cstdio>
#include <algorithm>
#define T 1000000000

struct aa{
    long long x1, y1, x2, y2;
}v[4];

inline long long maxim(long long a, long long b)
{
    return (a > b ? a : b);
}

inline long long minim(long long a, long long b)
{
    return (a < b ? a : b);
}

bool cmp(aa a, aa b)
{
    return (a.x1 < b.x1);
}

inline long long arie(long long a, long long b, long long c, long long d)
{
    return (c-a)*(b-d);
}

inline long long peri(long long a, long long b, long long c, long long d)
{
    return 2*(c-a) + 2*(b-d);
}

inline long long inter_arie(aa a, aa b)
{
    long long ls, cs, lj, cj;
    cs=minim(a.y1, b.y1);
    cj=maxim(a.y2, b.y2);

    ls=maxim(a.x1, b.x1);
    lj=minim(a.x2, b.x2);

    if(cj <= cs && lj >= ls)
        return (cs-cj)*(lj-ls);

    return 0;
}

inline long long inter_pr(aa a, aa b)
{
    long long ls, cs, lj, cj;
    cs=minim(a.y1, b.y1);
    cj=maxim(a.y2, b.y2);

    ls=maxim(a.x1, b.x1);
    lj=minim(a.x2, b.x2);

    if(cj <= cs && lj >= ls)
        return 2*(cs-cj)+2*(lj-ls);

    return 0;
}

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

    long long j, i, ar=0, pr=0, a, b, c, d;

    for(i=0;i<3;++i){
        scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
        v[i].x1=a+T;
        v[i].x2=c+T;
        v[i].y1=d+T;
        v[i].y2=b+T;
        ar+=arie(v[i].x1, v[i].y1, v[i].x2, v[i].y2);
        pr+=peri(v[i].x1, v[i].y1, v[i].x2, v[i].y2);
    }

    std::sort(v, v+3, cmp);

    for(i=0;i<3;++i)
        for(j=i+1;j<3;++j)
        {
            ar-=inter_arie(v[i], v[j]);
            pr-=inter_pr(v[i], v[j]);
        }

    v[3].y1=minim(v[0].y1, v[1].y1);
    v[3].y2=maxim(v[0].y2, v[1].y2);

    v[3].x1=v[1].x1;
    v[3].x2=minim(v[0].x2, v[1].x2);

    if(v[3].x2 >= v[3].x1 && v[3].y2 <= v[3].y1)
    {
        ar+=inter_arie(v[3], v[2]);
        pr+=inter_pr(v[3], v[2]);
    }

    printf("%lld %lld", ar, pr);

    return 0;
}