Cod sursa(job #3174016)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 24 noiembrie 2023 10:20:27
Problema Reuniune Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>

using namespace std;

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

pair<int,int> interval_inters(int a1, int a2, int b1, int b2)
{
    if(a1 > b1)
    {
        swap(a1,b1);
        swap(a2,b2);
    }
    if(a2< b1) return {0,0};

    if(b2 <= a2) return {b1,b2};
    else return {b1,a2};
}

struct drept{
    int xj,yj,xs,ys;

    drept operator * (const drept &other)
    {
        pair<int,int> intervY = interval_inters(yj,ys,other.yj,other.ys);
        pair<int,int> intervX = interval_inters(xj,xs,other.xj,other.xs);
        return {intervX.first,intervY.first,intervX.second,intervY.second};
    }
    int area()
    {
        return (xs - xj) * (ys - yj);
    }
} d[3];

int arie_reuniuni(drept a, drept b, drept c)
{
    int rasp = a.area() + b.area() + c.area();
    rasp -= (a*b).area() + (a*c).area() + (b*c).area();
    rasp += ((a * b) * c) .area();
    return rasp;
}

int main()
{
    for(int i=0; i<3; i++)
    {
        fin>>d[i].xj>>d[i].yj>>d[i].xs>>d[i].ys;
    }

    fout<<arie_reuniuni(d[0],d[1],d[2])<<" ";

    int perimetru = 0;

    for(int i=0; i<3; i++)
    {
        drept lat = {d[i].xs,d[i].yj,d[i].xs,d[i].ys};
        int ar = lat.area()
                - (lat * d[(i+1) % 3]) .area()
                - (lat * d[(i+2) % 3]) .area()
                + (lat * (d[(i+1) % 3] * d[(i+2) % 3]) ).area();
        perimetru += ar;

        lat = {d[i].xj + 1,d[i].ys,d[i].xs - 1,d[i].ys};
         ar = lat.area()
                - (lat * d[(i+1) % 3]) .area()
                - (lat * d[(i+2) % 3]) .area()
                + (lat * (d[(i+1) % 3] * d[(i+2) % 3]) ).area();
        perimetru += ar;

        lat = {d[i].xj,d[i].yj + 1,d[i].xj,d[i].ys - 1};
         ar = lat.area()
                - (lat * d[(i+1) % 3]) .area()
                - (lat * d[(i+2) % 3]) .area()
                + (lat * (d[(i+1) % 3] * d[(i+2) % 3]) ).area();
        perimetru += ar;

        lat = {d[i].xj,d[i].yj,d[i].xs,d[i].yj};
         ar = lat.area()
                - (lat * d[(i+1) % 3]) .area()
                - (lat * d[(i+2) % 3]) .area()
                + (lat * (d[(i+1) % 3] * d[(i+2) % 3]) ).area();
        perimetru += ar;
    }
    fout<<perimetru;
    return 0;
}