Cod sursa(job #3217975)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 25 martie 2024 13:36:51
Problema Reuniune Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>

using namespace std;

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

const int NrDreptunghiuri = 3;

typedef long long ll;

struct punct{
    ll x, y;
};

struct dreptunghi{
    punct capat_st, capat_dr;

    void citire(){
        fin >> capat_st.x >> capat_st.y >> capat_dr.x >> capat_dr.y;
    }

    ll perimetru(){
        if(capat_st.x > capat_dr.x || capat_st.y > capat_dr.y){
            return 0;
        }

        return ((capat_dr.x - capat_st.x) + (capat_dr.y - capat_st.y)) * 2;
    }

    ll arie(){
        if(capat_st.x > capat_dr.x || capat_st.y > capat_dr.y){
            return 0;
        }

        return (capat_dr.x - capat_st.x) * (capat_dr.y - capat_st.y);
    }
};

dreptunghi drept[NrDreptunghiuri];

dreptunghi intersect(dreptunghi a, dreptunghi b){
    dreptunghi sol;

    sol.capat_st.x = max(a.capat_st.x, b.capat_st.x);
    sol.capat_st.y = max(a.capat_st.y, b.capat_st.y);

    sol.capat_dr.x = min(a.capat_dr.x, b.capat_dr.x);
    sol.capat_dr.y = min(a.capat_dr.y, b.capat_dr.y);

    return sol;
}

int main(){
    ll arie_reuniune, perimetru_reuniune;

    for(int i = 0; i < NrDreptunghiuri; i++){
        drept[i].citire();
    }

    arie_reuniune = drept[0].arie() + drept[1].arie() + drept[2].arie();
    arie_reuniune -= intersect(drept[0], drept[1]).arie() + intersect(drept[1], drept[2]).arie() + intersect(drept[0], drept[2]).arie();
    arie_reuniune += intersect(intersect(drept[0], drept[1]), drept[2]).arie();

    perimetru_reuniune = drept[0].perimetru() + drept[1].perimetru() + drept[2].perimetru();
    perimetru_reuniune -= intersect(drept[0], drept[1]).perimetru() + intersect(drept[1], drept[2]).perimetru() + intersect(drept[0], drept[2]).perimetru();
    perimetru_reuniune += intersect(intersect(drept[0], drept[1]), drept[2]).perimetru();

    fout << arie_reuniune << " " << perimetru_reuniune;

    return 0;
}