Cod sursa(job #2653664)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 28 septembrie 2020 19:08:42
Problema Reuniune Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
using namespace std;

ifstream fin("reuniune.in");
ofstream fout("reuniune.out");

struct p
{
    long long x, y;
};

struct du
{
    p s, d;
};

long long aria(du x)
{
    if (x.s.x == -1)
        return 0;
    return (x.d.x - x.s.x)*(x.d.y - x.s.y);
}
long long per(du x)
{
    if (x.s.x == -1)
        return 0;
    return 2*(x.d.x - x.s.x + x.d.y - x.s.y);
}

du inter(du a, du b)
{
    if (a.s.x == -1 || b.s.x == -1)
        return {-1, 0, 0, 0};
    du c;
    long long st, dr;
    //axa Ox
    st = max(a.s.x, b.s.x);
    dr = min(a.d.x, b.d.x);
    if (st > dr)
        return {-1, 0, 0, 0};
    c.s.x = st;
    c.d.x = dr;
    
    //axa Oy
    st = max(a.s.y, b.s.y);
    dr = min(a.d.y, b.d.y);
    if (st > dr)
        return {-1, 0, 0, 0};
    c.s.y = st;
    c.d.y = dr;
    return c;
}

int main()
{
    int i;
    du d[4];
    for (i = 1; i<=3; i++)
    {
        fin >> d[i].s.x >> d[i].s.y >> d[i].d.x >> d[i].d.y;
    }
    long long a, p;
    a = p = 0;
    du e[4];
    e[1] = inter(d[1], d[2]);
    e[2] = inter(d[1], d[3]);
    e[3] = inter(d[2], d[3]);
    for (i = 1; i<=3; i++)
    {
        a += aria(d[i]);
        a -= aria(e[i]);
        p += per(d[i]);
        p -= per(e[i]);
    }
    a += aria(inter(e[1], d[3]));
    p += per(inter(e[1], d[3]));
    fout << a << ' ' << p;
    return 0;
}