Cod sursa(job #1452160)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 20 iunie 2015 09:32:55
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <cstdio>

long long cit() {
    long long ans = 0;
    char c = getchar();
    bool neg = false;
    while (c < '0' || c > '9') {
        if (c == '-') {
            c = getchar();
            neg = true;
            break;
        }
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        ans = (ans << 3) + (ans << 1) + (c - '0');
        c = getchar();
    }
    return (neg) ? -ans : ans;
}

void afis(long long n) {
    int l = 0;
    char c[20];
    if (n == 0) {
        putchar('0');
    }
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    while (n > 0) {
        c[l++] = n % 10 + '0';
        n /= 10;
    }
    for (int i = l - 1; i >= 0; i--) {
        putchar(c[i]);
    }
    putchar(' ');
}

long long a[3], b[3], c[3], d[3];

long long dbl(int i, int j, long long& tp) {
    if (c[i] <= c[j] && a[i] >= a[j] && b[i] >= b[j] && d[i] <= d[j]) {
        if ((c[i] - a[i]) * (d[i] - b[i]) != 0) {
            tp -= 2 * (c[i] - a[i] + d[i] - b[i]);
        } else {
            tp -= (c[i] - a[i] + d[i] - b[i]);
        }
        return (c[i] - a[i]) * (d[i] - b[i]);
    }
    if (c[j] <= c[i] && a[j] >= a[i] && b[j] >= b[i] && d[j] <= d[i]) {
        if ((c[j] - a[j]) * (d[j] - b[j]) != 0) {
            tp -= 2 * (c[j] - a[j] + d[j] - b[j]);
        } else {
            tp -= (c[j] - a[j] + d[j] - b[j]);
        }
        return (c[j] - a[j]) * (d[j] - b[j]);
    }
    if (c[i] <= a[j] || c[j] <= a[j] || b[i] >= d[j] || b[j] >= d[i]) {
        if (c[i] == a[j] || c[j] == a[i]) {
            long long su = (d[i] < d[j]) ? d[i] : d[j];
            long long jo = (b[i] > b[j]) ? b[i] : b[j];
            tp -= (su - jo);
        }
        if (b[i] == d[j] || b[j] == d[i]) {
            long long st = (a[i] > a[j]) ? a[i] : a[j];
            long long dr = (c[i] < c[j]) ? c[i] : c[j];
            tp -= (dr - st);
        }
        return 0;
    }
    long long st = (a[i] > a[j]) ? a[i] : a[j];
    long long dr = (c[i] < c[j]) ? c[i] : c[j];
    long long su = (d[i] < d[j]) ? d[i] : d[j];
    long long jo = (b[i] > b[j]) ? b[i] : b[j];
    tp -= 2 * (dr - st + su - jo);
    return (dr - st) * (su - jo);
}

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

    for (int i = 0; i < 3; i++) {
        a[i] = cit();
        b[i] = cit();
        c[i] = cit();
        d[i] = cit();
    }

    long long ta = 0, tp = 0;
    for (int i = 0; i < 3; i++) {
        ta += (c[i] - a[i]) * (d[i] - b[i]);
        if (c[i] == a[i] || d[i] == b[i]) {
            tp += (c[i] - a[i] + d[i] - b[i]);
        } else {
            tp += 2 * (c[i] - a[i] + d[i] - b[i]);
        }
    }
    long long s1 = dbl(0, 1, tp), s2 = dbl(1, 2, tp), s3 = dbl(2, 0, tp);
    ta -= s1;
    ta -= s2;
    ta -= s3;
    long long st, dr, su, jo;
    if (s1 != 0 && s2 != 0 && s3 != 0) {
        st = (a[0] > a[1]) ? a[0] : a[1];
        dr = (c[0] < c[1]) ? c[0] : c[1];
        su = (d[0] < d[1]) ? d[0] : d[1];
        jo = (b[0] > b[1]) ? b[0] : b[1];
        st = (st > a[2]) ? st : a[2];
        dr = (dr < c[2]) ? dr : c[2];
        su = (su < d[2]) ? su : d[2];
        jo = (jo > b[2]) ? jo : b[2];
        ta += (su - jo) * (dr - st);
        tp += 2 * (su - jo + dr - st);
    }
    afis(ta);
    afis(tp);
    return 0;
}