Cod sursa(job #896775)

Utilizator sebii_cSebastian Claici sebii_c Data 27 februarie 2013 17:12:43
Problema Reuniune Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <cstdio>

#include <algorithm>

using namespace std;

struct rect {
    long long x1, y1;
    long long x2, y2;

    rect() {}
    rect(long long _x1, long long _y1, long long _x2, long long _y2):
        x1(_x1), y1(_y1), x2(_x2), y2(_y2) {}
};

void swap(rect& a, rect& b)
{
    rect c(a.x1, a.y1, a.x2, b.y2);
    a = b;
    b = c;
}

long long area(rect a)
{
    return (a.x2 - a.x1) * (a.y2 - a.y1);
}

long long perimeter(rect a)
{
    return 2 * (a.x2 - a.x1) + 2 * (a.y2 - a.y1);
}

long long intersect(rect a, rect b)
{
    if (a.x1 > b.x1)
        swap(a, b);
    if (a.x2 < b.x1)
        return 0;
    if (a.y2 < b.y1)
        return 0;

    return (min(a.x2, b.x2) - max(a.x1, b.x1)) * 
           (min(a.y2, b.y2) - max(a.y1, b.y1));
}

long long intersect(rect a, rect b, rect c)
{
    if (intersect(a, b) == 0 || intersect(a, c) == 0 || 
            intersect(b, c) == 0)
        return 0;

    if (a.x1 > b.x1)
        swap(a, b);

    rect r;
    r = rect(max(a.x1, b.x1), max(a.y1, b.y1), 
             min(a.x2, b.x2), min(a.y2, b.y2));

    return intersect(r, c);
}

long long intersect_per(rect a, rect b)
{
    if (a.x1 > b.x1)
        swap(a, b);
    if (a.x2 < b.x1)
        return 0;
    if (a.y2 < b.y1)
        return 0;

    return 2 * (min(a.x2, b.x2) - max(a.x1, b.x1)) + 
           2 * (min(a.y2, b.y2) - max(a.y1, b.y1));
}

long long intersect_per(rect a, rect b, rect c)
{
    if (intersect_per(a, b) == 0 || intersect_per(a, c) == 0 || 
            intersect_per(b, c) == 0)
        return 0;

    if (a.x1 > b.x1)
        swap(a, b);

    rect r;
    r = rect(max(a.x1, b.x1), max(a.y1, b.y1), 
             min(a.x2, b.x2), min(a.y2, b.y2));

    return intersect_per(r, c);
}

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

    long long x1, y1, x2, y2;
    rect r[3];
    for (int i = 0; i < 3; ++i) {
        scanf("%lld %lld %lld %lld", &x1, &y1, &x2, &y2);
        r[i] = rect(x1, y1, x2, y2);
    }

    printf("%lld", area(r[0]) + area(r[1]) + area(r[2]) -
            intersect(r[0], r[1]) - intersect(r[1], r[2]) -
            intersect(r[0], r[2]) + intersect(r[0], r[1], r[2]));
    printf(" %lld\n", perimeter(r[0]) + perimeter(r[1]) + perimeter(r[2]) -
            intersect_per(r[0], r[1]) - intersect_per(r[1], r[2]) -
            intersect_per(r[0], r[2]) + intersect_per(r[0], r[1], r[2]));

    return 0;
}