Cod sursa(job #1327807)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 27 ianuarie 2015 09:33:43
Problema Reuniune Scor 100
Compilator cpp Status done
Runda simulareoji2015p2 Marime 1.89 kb
#include <fstream>
#include <iostream>
using namespace std;

struct drepT{
    long long x1, y1, x2, y2;
};

drepT ZERO;

bool operator == (const drepT &d1, const drepT &d2) {
    if (d1.x1 == d2.x1 && d1.x2 == d2.x2 && d1.y1 == d2.y1 && d1.y2 == d2.y2)
        return true;
    return false;
}

drepT reuniune(drepT d1, drepT d2) {
    if (d1 == ZERO || d2 == ZERO)
        return ZERO;

    drepT interS;
    if (d1.x1 > d2.x1) {
        drepT aux = d1;
        d1 = d2;
        d2 = aux;
    }
    if (d2.x1 > d1.x2)
        return ZERO;
    interS.x1 = d2.x1;
    interS.x2 = min(d2.x2, d1.x2);

    if (d1.y1 > d2.y1) {
        drepT aux = d1;
        d1 = d2;
        d2 = aux;
    }

    if (d2.y1 > d1.y2)
        return ZERO;
    interS.y1 = d2.y1;
    interS.y2 = min(d1.y2, d2.y2);
    
    return interS;
}

long long diffx(drepT d) {
    long long diff = d.x1 - d.x2;
    if (diff < 0)
        diff = -diff;
    return diff;
}

long long diffy(drepT d) {
    long long diff = d.y1 - d.y2;
    if (diff < 0)
        diff = -diff;
    return diff;
}

long long arie(drepT d) {
    return diffx(d) * diffy(d);
}

long long perimetru(drepT d) {
    return (2 * diffx(d)) + (2 * diffy(d));
}

int main () {
    ifstream cin("reuniune.in");
    ofstream cout("reuniune.out");

    drepT D[3];
    for (int i = 0 ; i < 3 ; ++i)
        cin >> D[i].x1 >> D[i].y1 >> D[i].x2 >> D[i].y2;

   // cerr << arie(D[0]) << " " << arie(D[1]) << " " << arie(D[2]) << "\n";
    drepT r1 = reuniune(D[0], D[1]), r2 = reuniune(D[1], D[2]);
    drepT r3 = reuniune(D[0], D[2]);
    drepT r4 = reuniune(r1, D[2]);
   // cerr<<arie(r1) << " " << arie(r2) << " " << arie(r3) << "\n";
    
    cout << arie(D[0]) + arie(D[1]) + arie(D[2]) - arie(r1) - arie(r2) - arie(r3) + arie(r4) << " ";
    cout << perimetru(D[0]) + perimetru(D[1]) + perimetru(D[2]) - perimetru(r1) - perimetru(r2) - perimetru(r3) + perimetru(r4) << "\n";   

    return 0;
}