Cod sursa(job #2707699)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 17 februarie 2021 16:53:54
Problema Reuniune Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

struct dreptunghi{
    int x1, y1, x2, y2;
};

struct segment{
    int start, finish;
};
segment segm[3];

int comparare(segment a, segment b){
    return (a.start < b.start) || (a.start == b.start && a.finish <= b.finish);
}

dreptunghi dr[3];

struct dreptunghi intersectie (struct dreptunghi i, struct dreptunghi j){
    struct dreptunghi nou;
    nou.x1 = max(i.x1, j.x1);
    nou.y1 = max(i.y1, j.y1);
    nou.x2 = min(i.x2, j.x2);
    nou.y2 = min(i.y2, j.y2);

    if(nou.x1 > nou.x2 || nou.y1 > nou.y2){
        nou.x1 = 0;
        nou.y1 = 0;
        nou.x2 = 0;
        nou.y2 = 0;
    }

    return nou;
}

inline int arie(dreptunghi Z){
    return (Z.x2 - Z.x1) * (Z.y2 - Z.y1);
}

int main()
{
    for(int i = 0; i < 3; i++){
        fin >> dr[i].x1 >> dr[i].y1 >> dr[i].x2 >> dr[i].y2;
    }

    //afisez aria
    //principiul includerii si excluderii
    fout << 1LL*( arie(dr[0]) + arie(dr[1]) + arie(dr[2]) - arie(intersectie(dr[0], dr[1])) - arie(intersectie(dr[0], dr[2])) - arie(intersectie(dr[1], dr[2])) + arie(intersectie(intersectie(dr[0], dr[1]), dr[2])) );

    fout << ' ';

    //afisez perimetrul
    long long perimetru = 0;
    for(int ct = 0; ct < 2; ct++){

        for(int i = 0; i < 3; i++){
            if(ct == 0){
                segm[i].start = dr[i].x1;
                segm[i].finish = dr[i].x2;
            }
            else if(ct == 1){
                segm[i].start = dr[i].y1;
                segm[i].finish = dr[i].y2;
            }
        }

        sort(segm, segm + 3, comparare);

        int startTemp = segm[0].start;
        int finishTemp = segm[0].finish;
        for(int i = 1; i < 3; i++){
            if(segm[i].start > finishTemp){
                perimetru += (finishTemp - startTemp) * 2;
                startTemp = segm[i].start;
                finishTemp = segm[i].finish;
            }
            else if(segm[i].finish > finishTemp){
                finishTemp = segm[i].finish;
            }
        }
        perimetru += (finishTemp - startTemp) * 2;
    }

    fout<<perimetru;

}