Cod sursa(job #896805)

Utilizator sebii_cSebastian Claici sebii_c Data 27 februarie 2013 17:25:41
Problema Reuniune Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 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)
{
    if (a.y2 == a.y1)
        return a.x2 - a.x1;
    if (a.x2 == a.x1)
        return a.y2 - a.y1;
    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;

    rect r(max(a.x1, b.x1), max(a.y1, b.y1),
           min(a.x2, b.x2), min(a.y2, b.y2));
    return area(r);
}

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;

    rect r(max(a.x1, b.x1), max(a.y1, b.y1),
           min(a.x2, b.x2), min(a.y2, b.y2));
    return perimeter(r);
}

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;
}