Cod sursa(job #1988249)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 2 iunie 2017 15:40:14
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>

using namespace std;

FILE *in,*out;

struct Dreptunghi
{
    int x;
    int y;
    int z;
    int t;
} d[5],v[6];

int max(int a,int b)
{
    if(a > b)
        return a;
    return b;
}

int min(int a,int b)
{
    if(a < b)
        return a;
    return b;
}

Dreptunghi intersectie(Dreptunghi a,Dreptunghi b)
{
    Dreptunghi c;
    c.x = max(a.x,b.x);
    c.y = max(a.y,b.y);

    c.z = min(a.z,b.z);
    c.t = min(a.t,b.t);
    if(c.x > c.z || c.y > c.t)
    {
        c.x = 0;
        c.y = 0;

        c.z = 0;
        c.t = 0;
    }
    return c;
}

long long calcarie(Dreptunghi a)
{
    return 1LL * (a.z - a.x) * (a.t - a.y);
}

long long calcperimetru(Dreptunghi a)
{
    return (1LL * (a.z - a.x) + (a.t - a.y))*2;
}

int main()
{

    in = fopen("reuniune.in","r");
    out = fopen("reuniune.out","w");
    long long arie =0,nr = 0,perimetru = 0;
    for(int i =1; i <= 3; i ++)
    {
        fscanf(in,"%d %d %d %d",&d[i].x,&d[i].y,&d[i].z,&d[i].t);
        arie += calcarie(d[i]);
        perimetru += calcperimetru(d[i]);
        for(int j = 1; j < i; j ++)
        {
            nr ++;
            v[nr] = intersectie(d[i],d[j]);
            perimetru -= calcperimetru(v[nr]);
            arie -= calcarie(v[nr]);
        }
    }
    arie += calcarie(intersectie(d[3],v[1]));
    perimetru += calcperimetru(intersectie(d[3],v[1]));
    fprintf(out,"%lld %lld",arie,perimetru);
    return 0;
}