Cod sursa(job #1226438)

Utilizator ZenusTudor Costin Razvan Zenus Data 5 septembrie 2014 14:05:39
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int mask,one,i,j,f;
bool flag;
int current[2][2];
int D[3][2][2];
pair < long long , long long > total;

long long arie(int D[2][2])
{
    return (((long long)D[0][1]-D[0][0])*(D[1][1]-D[1][0]));
}

long long perimetru(int D[2][2])
{
    return 2*(((long long)D[0][1]-D[0][0])+(D[1][1]-D[1][0]));
}

void intersectie(int A[2][2],int B[2][2])
{
    int C[2][2];

    C[0][0]=max(A[0][0],B[0][0]);
    C[0][1]=min(A[0][1],B[0][1]);
    C[1][0]=max(A[1][0],B[1][0]);
    C[1][1]=min(A[1][1],B[1][1]);

    memcpy(A,C,sizeof(C));
}

int main()
{
freopen("reuniune.in","r",stdin);
freopen("reuniune.out","w",stdout);

for (f=0;f<=2;++f)
for (i=0;i<=1;++i)
for (j=0;j<=1;++j)
scanf("%d",&D[f][j][i]);

for (mask=1;mask<=7;++mask)
{
    one=0;
    flag=false;

    for (i=one=0;i<=2;++i)
    if (mask&(1<<i))
    {
        ++one;
        if (!flag)
        {
            flag=true;
            memcpy(current,D[i],sizeof(D[i]));
            continue;
        }

        intersectie(current,D[i]);
    }

    total.first+=(one&1) ? -arie(current) : arie(current);
    total.second+=(one&1) ? -perimetru(current) : perimetru(current);
}

printf("%lld %lld\n",-total.first,-total.second);

return 0;
}