Cod sursa(job #2107847)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 17 ianuarie 2018 19:15:46
Problema Reuniune Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("reuniune.in");
ofstream out("reuniune.out");
#define int long long
struct patrat
{
    int x1, y1, x2, y2;
};

inline int mod(int x)
{
    return max(x, 0LL);
}

int arie(patrat p1)
{
    return (p1.x2 - p1.x1) * (p1.y2 - p1.y1);
}

int intersectie_mica(patrat p1, patrat p2)
{
    int lin1 = max(p1.x1, p2.x1);
    int lin2 = min(p1.x2, p2.x2);
    int col1 = max(p1.y1, p2.y1);
    int col2 = min(p1.y2, p2.y2);
    return mod(lin2 - lin1) * mod(col2 - col1);
}

int intersectie_mare(patrat p1, patrat p2, patrat p3)
{
    int lin1 = max(max(p1.x1, p2.x1), p3.x1);
    int lin2 = min(min(p1.x2, p2.x2), p3.x2);
    int col1 = max(max(p1.y1, p2.y1), p3.y1);
    int col2 = min(min(p1.y2, p2.y2), p3.y2);
    return mod(lin2 - lin1) * mod(col2 - col1);
}

int perim(patrat p1)
{
    int lg1 = mod(p1.x2 - p1.x1);
    int lg2 = mod(p1.y2 - p1.y1);
    return (lg1 + lg2) * 2;
}

int int_mic(patrat p1, patrat p2)
{
    int coltx1 = max(p1.x1, p2.x1);
    int colty1 = max(p1.y1, p2.y1);
    int coltx2 = min(p1.x2, p2.x2);
    int colty2 = min(p1.y2, p2.y2);
    int latx = mod(coltx2 - coltx1);
    int laty = mod(colty2 - colty1);
    return (latx + laty) * 2;
}

int int_mare(patrat p1, patrat p2, patrat p3)
{
    int coltx1 = max(max(p1.x1, p2.x1), p3.x1);
    int colty1 = max(max(p1.y1, p2.y1), p3.y1);
    int coltx2 = min(min(p1.x2, p2.x2), p3.x2);
    int colty2 = min(min(p1.y2, p2.y2), p3.y2);
    int latx = mod(coltx2 - coltx1);
    int laty = mod(colty2 - colty1);
    return (latx + laty) * 2;
}

int32_t main()
{
    patrat p1, p2, p3;
    in >> p1.x1 >> p1.y1 >> p1.x2 >> p1.y2;
    in >> p2.x1 >> p2.y1 >> p2.x2 >> p2.y2;
    in >> p3.x1 >> p3.y1 >> p3.x2 >> p3.y2;
    //cerr << intersectie_mica(p1, p3) << "\n";
    if(intersectie_mica(p1, p2) == 0 || intersectie_mica(p2, p3) == 0 || intersectie_mica(p1, p3) == 0)
    {
        out << 0 << " " << 0 << "\n";
        return 0;
    }
    //cerr << arie(p1) << " " << arie(p2) << " " << arie(p3) << "\n";
    //cerr << intersectie_mica(p1, p2) << " " << intersectie_mica(p2, p3) << " " << intersectie_mica(p1, p3) << "\n";
    out << arie(p1) + arie(p2) + arie(p3) - intersectie_mica(p1, p2) - intersectie_mica(p2, p3) - intersectie_mica(p1, p3) + intersectie_mare(p1, p2, p3) << " ";
    out << perim(p1) + perim(p2) + perim(p3) - int_mic(p1, p2) - int_mic(p2, p3) - int_mic(p1, p3) + int_mare(p1, p2, p3) << "\n";
    return 0;
}