Cod sursa(job #2286795)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 20 noiembrie 2018 19:39:25
Problema Reuniune Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>

#define input "reuniune.in"
#define output "reuniune.out"

using namespace std;

ifstream in(input);
ofstream out(output);

struct punct
{
    int x, y;
};
struct dreptunghi
{
    punct st_jos, dr_sus;
};

long long abs(long long a)
{
    return a < 0 ? -a : a;
}

dreptunghi A, B, C;

bool Nu_Int(dreptunghi A, dreptunghi B)
{
    if(B.st_jos.x > A.dr_sus.x || B.st_jos.y > A.dr_sus.y || B.dr_sus.x < A.st_jos.x || B.dr_sus.y < A.st_jos.y) return true;
    return false;
}

void Read_Data()
{
    // Dreptunghi A
    in >> A.st_jos.x >> A.st_jos.y >> A.dr_sus.x >> A.dr_sus.y;
    // Dreptunghi B
    in >> B.st_jos.x >> B.st_jos.y >> B.dr_sus.x >> B.dr_sus.y;
    // Dreptunghi C
    in >> C.st_jos.x >> C.st_jos.y >> C.dr_sus.x >> C.dr_sus.y;
}

dreptunghi Intersectie(dreptunghi A, dreptunghi B)
{
    dreptunghi Nou = {0, 0, 0, 0};
    if(!Nu_Int(A, B))
    {
        Nou.st_jos.x = max(A.st_jos.x, B.st_jos.x);
        Nou.st_jos.y = max(A.st_jos.y, B.st_jos.y);
        Nou.dr_sus.x = min(A.dr_sus.x, B.dr_sus.x);
        Nou.dr_sus.y = min(A.dr_sus.y, B.dr_sus.y);
    }
    return Nou;
}

long long Area(dreptunghi A)
{
    return (long long)abs(A.dr_sus.x - A.st_jos.x) * abs(A.dr_sus.y - A.st_jos.y);
}

long long Perimeter(dreptunghi A)
{
    return (long long)2*(abs(A.dr_sus.x - A.st_jos.x) + abs(A.dr_sus.y - A.st_jos.y));
}

void Solve()
{
    dreptunghi AB = Intersectie(A, B), BC = Intersectie(B, C), AC = Intersectie(A, C), ABC = Intersectie(A, BC);
    long long arie = (long long)Area(A) + Area(B) + Area(C) - Area(AB) - Area(BC) - Area(AC) + Area(ABC);
    long long perimetru = (long long)Perimeter(A) + Perimeter(B) + Perimeter(C) - Perimeter(AB) - Perimeter(BC) - Perimeter(AC) + Perimeter(ABC);
    out << arie << " " << perimetru << "\n";
}

int main()
{
    Read_Data();
    Solve();
    return 0;
}