Cod sursa(job #2563984)

Utilizator ililogIlinca ililog Data 1 martie 2020 16:41:52
Problema Reuniune Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.2 kb
using namespace std;
#include<bits/stdc++.h>

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

int xuri[7], nrxuri;
int yuri[7], nryuri;
set<long long> frx;
set<long long> fry;

unsigned long long ariaTotala, perimetruTotal;

struct punct{
    int x;
    int y;
};

struct dreptunghi{
    punct stjos;
    punct drsus;
} a, b, c, dmare;

void citire(dreptunghi &d) {
    fin >> d.stjos.x >> d.stjos.y >> d.drsus.x >> d.drsus.y;

    frx.insert(d.stjos.x);
    frx.insert(d.drsus.x);

    fry.insert(d.stjos.y);
    fry.insert(d.drsus.y);
}

unsigned long long aria(dreptunghi d) {
    return (d.drsus.x - d.stjos.x) * (d.drsus.y - d.stjos.y);
}

bool seAflaInInterior(dreptunghi mic) {
    bool ok = 0;
    if (a.stjos.x <= mic.stjos.x && mic.drsus.x <= a.drsus.x) {
        if (a.stjos.y <= mic.stjos.y && mic.drsus.y <= a.drsus.y) {
            ok = 1;
        }
    }

    if (b.stjos.x <= mic.stjos.x && mic.drsus.x <= b.drsus.x) {
        if (b.stjos.y <= mic.stjos.y && mic.drsus.y <= b.drsus.y) {
            ok = 1;
        }
    }

    if (c.stjos.x <= mic.stjos.x && mic.drsus.x <= c.drsus.x) {
        if (c.stjos.y <= mic.stjos.y && mic.drsus.y <= c.drsus.y) {
            ok = 1;
        }
    }

    return ok;
}

bool segmentValabilX(int x1, int x2, int Y) {

    bool intrat = 0;
    if (a.stjos.y == Y || a.drsus.y == Y) {
        if (b.stjos.y < Y && Y < b.drsus.y && b.stjos.x <= x1 && x2 <= b.drsus.x) {
            return 0;
        }

        if (c.stjos.y < Y && Y < c.drsus.y && c.stjos.x <= x1 && x2 <= c.drsus.x) {
            return 0;
        }

        if (a.stjos.x <= x1 && x2 <= a.drsus.x) {
            intrat = 1;
        }
    }

    if (b.stjos.y == Y || b.drsus.y == Y) {
        if (a.stjos.y < Y && Y < a.drsus.y && a.stjos.x <= x1 && x2 <= a.drsus.x) {
            return 0;
        }

        if (c.stjos.y < Y && Y < c.drsus.y && c.stjos.x <= x1 && x2 <= c.drsus.x) {
            return 0;
        }

        if (b.stjos.x <= x1 && x2 <= b.drsus.x) {
            intrat = 1;
        }
    }

    if (c.stjos.y == Y || c.drsus.y == Y) {
        if (a.stjos.y < Y && Y < a.drsus.y && a.stjos.x <= x1 && x2 <= a.drsus.x) {
            return 0;
        }

        if (b.stjos.y < Y && Y < b.drsus.y && b.stjos.x <= x1 && x2 <= b.drsus.x) {
            return 0;
        }

        if (c.stjos.x <= x1 && x2 <= c.drsus.x) {
            intrat = 1;
        }
    }

    if (intrat == 0) {
        return 0;
    }

    return 1;
}

bool segmentValabilY(int y1, int y2, int X) {
    bool intrat = 0;
    if (a.stjos.x == X || a.drsus.x == X) {
        if (b.stjos.x < X && X < b.drsus.x && b.stjos.y <= y1 && y2 <= b.drsus.y) {
            return 0;
        }

        if (c.stjos.x < X && X < c.drsus.x && c.stjos.y <= y1 && y2 <= c.drsus.y) {
            return 0;
        }

        if (a.stjos.y <= y1 && y2 <= a.drsus.y) {
            intrat = 1;
        }
    }

    if (b.stjos.x == X || b.drsus.x == X) {
        if (a.stjos.x < X && X < a.drsus.x && a.stjos.y <= y1 && y2 <= a.drsus.y) {
            return 0;
        }

        if (c.stjos.x < X && X < c.drsus.x && c.stjos.y <= y1 && y2 <= c.drsus.y) {
            return 0;
        }

        if (b.stjos.y <= y1 && y2 <= b.drsus.y) {
            intrat = 1;
        }
    }

    if (c.stjos.x == X || c.drsus.x == X) {
        if (a.stjos.x < X && X < a.drsus.x && a.stjos.y <= y1 && y2 <= a.drsus.y) {
            return 0;
        }

        if (b.stjos.x < X && X < b.drsus.x && b.stjos.y <= y1 && y2 <= b.drsus.y) {
            return 0;
        }

        if (c.stjos.y <= y1 && y2 <= c.drsus.y) {
            intrat = 1;
        }
    }

    if (intrat == 0) {
        return 0;
    }

    return 1;
}


int main() {

    citire(a);
    citire(b);
    citire(c);

    for (auto i = frx.begin(); i!=frx.end(); i++) {
        nrxuri++;
        xuri[nrxuri] = *i;
    }

    for (auto i = fry.begin(); i!=fry.end(); i++) {
        nryuri++;
        yuri[nryuri] = *i;
    }
/*
    for (int i = 1; i<=nrxuri; i++) {
        cout << xuri[i] << " ";
    }
    cout << endl;

    for (int i = 1; i<=nryuri; i++) {
        cout << yuri[i] << " ";
    }
    cout << endl;*/

    for (int i = 1; i<nryuri; i++) {
        for (int j = 1; j<nrxuri; j++) {

            punct stjosD = {xuri[j], yuri[i]};
            punct drsusD = {xuri[j+1], yuri[i+1]};
            dreptunghi D = {stjosD, drsusD};

            if (seAflaInInterior(D)) {
                ariaTotala += aria(D);
            }
        }
    }

    fout << ariaTotala << " ";

    for (int i = 1; i<=nryuri; i++) {
        for (int j = 1; j<nrxuri; j++) {
            if (segmentValabilX(xuri[j], xuri[j+1], yuri[i])) {
                perimetruTotal += (xuri[j+1] - xuri[j]);
            }
        }
    }


    for (int i = 1; i<=nrxuri; i++) {
        for (int j = 1; j<nryuri; j++) {
            if (segmentValabilY(yuri[j], yuri[j+1], xuri[i])) {
                perimetruTotal += (yuri[j+1] - yuri[j]);
            }
        }
    }


    fout << perimetruTotal;


    fin.close();
    fout.close();

    return 0;
}