Cod sursa(job #2087395)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 13 decembrie 2017 16:30:10
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <cmath>

using namespace std;

long long arie, perim, p[5][5];

void citire();
void rezolva();
long long ari(int,int,int);
long long per(int,int,int);
long long min(long long,long long );
long long max(long long,long long );
void afiseaza();

int main()
{
    citire();
    rezolva();
    afiseaza();
    return 0;
}

void citire()
{
    freopen("reuniune.in","r",stdin);
    scanf("%lld %lld %lld %lld",&p[1][0],&p[1][1],&p[1][2],&p[1][3]);
    scanf("%lld %lld %lld %lld",&p[2][0],&p[2][1],&p[2][2],&p[2][3]);
    scanf("%lld %lld %lld %lld",&p[3][0],&p[3][1],&p[3][2],&p[3][3]);
}
void afiseaza()
{
    freopen("reuniune.out","w",stdout);
    printf("%lld %lld\n",arie,perim);
}

void rezolva()
{
    arie+=ari(1,1,1)+ari(2,2,2)+ari(3,3,3)-ari(1,2,2)-ari(1,3,3)-ari(2,3,3)+ari(1,2,3);
    perim+=per(1,1,1)+per(2,2,2)+per(3,3,3)-per(1,2,2)-per(1,3,3)-per(2,3,3)+per(1,2,3);
}

long long ari(int k,int l, int m)
{
    long long x1,x2,y1,y2;
    x1=max(max(p[k][0],p[l][0]),p[m][0]);
    x2=min(min(p[k][2],p[l][2]),p[m][2]);
    y1=max(max(p[k][1],p[l][1]),p[m][1]);
    y2=min(min(p[k][3],p[l][3]),p[m][3]);
    if (x2>=x1 && y2>=y1)
        return (x2-x1)*(y2-y1);
    else
        return 0;
}
long long per(int k,int l,int m)
{
    long long x1,x2,y1,y2;
    x1=max(max(p[k][0],p[l][0]),p[m][0]);
    x2=min(min(p[k][2],p[l][2]),p[m][2]);
    y1=max(max(p[k][1],p[l][1]),p[m][1]);
    y2=min(min(p[k][3],p[l][3]),p[m][3]);
    if (x2>=x1 && y2>=y1)
        return 2*(x2+y2-x1-y1);
    else    return 0;

}

long long min(long long a,long long b)
{
    if (a<b) return a;
    else     return b;
}
long long max(long long a,long long b)
{
    if (a>b) return a;
    else     return b;
}