Cod sursa(job #2563908)

Utilizator ililogIlinca ililog Data 1 martie 2020 16:01:21
Problema Reuniune Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 6.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;
bool frx[1000001], fry[1000001];
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;

    //d.stsus = {d.stjos.x, d.drsus.y};
    //d.drjos = {d.drsus.x, d.stjos.y};

    if (d.stjos.x < dmare.stjos.x) {
        dmare.stjos.x = d.stjos.x;
    }

    if (d.drsus.x > dmare.drsus.x) {
        dmare.drsus.x = d.drsus.x;
    }

    if (d.stjos.y < dmare.stjos.y) {
        dmare.stjos.y = d.stjos.y;
    }

    if (d.drsus.y > dmare.drsus.y) {
        dmare.drsus.y = d.drsus.y;
    }

    if (frx[d.stjos.x] == 0) {
        nrxuri++;
        xuri[nrxuri] = d.stjos.x;
        frx[d.stjos.x] = 1;
    }

    if (frx[d.drsus.x] == 0) {
        nrxuri++;
        xuri[nrxuri] = d.drsus.x;
        frx[d.drsus.x] = 1;
    }

    if (fry[d.stjos.y] == 0) {
        nryuri++;
        yuri[nryuri] = d.stjos.y;
        fry[d.stjos.y] = 1;
    }

    if (fry[d.drsus.y] == 0) {
        nryuri++;
        yuri[nryuri] = d.drsus.y;
        fry[d.drsus.y] = 1;
    }

}

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);

    //cout << dmare.stjos.x << " " << dmare.stjos.y << "   " << dmare.drsus.x << " " << dmare.drsus.y << endl;

    sort(xuri+1, xuri+nrxuri+1);
    sort(yuri+1, yuri+nryuri+1);
/*
    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++) {
            //cout << xuri[j] << " " << yuri[i] << "   " << xuri[j+1] << " " << yuri[i+1] << endl;

            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]);
               // cout << "Y: " << yuri[i] << "   X:" << xuri[j] << " " << xuri[j+1] << endl;
            }
        }
    }

   // cout << perimetruTotal << endl;

    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]);
            }
        }
    }

   // cout << perimetruTotal << endl;

    fout << perimetruTotal;


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

    return 0;
}