Cod sursa(job #379500)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 1 ianuarie 2010 23:37:45
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <algorithm>
using namespace std;

struct dreptunghi {

    long long x0, x1, y0, y1;
};

long long A, P;
dreptunghi aux, d[ 3 ];

long long aria( dreptunghi d ) {

    return ( d.x1 - d.x0 )*( d.y1 - d.y0 );
}

long long intersectie( dreptunghi d1, dreptunghi d2 ) {

    return d1.x0 <= d2.x1 && d1.x1 >= d2.x0 && d1.y0 <= d2.y1 && d1.y1 >= d2.y0;
}

long long perimetru( dreptunghi d ) {

    return 2*( ( d.x1 - d.x0 )+( d.y1 - d.y0 ) );
}

void reuniune( dreptunghi d1, dreptunghi d2 ) {

    aux.x0 = max( d1.x0, d2.x0 );
    aux.y0 = max( d1.y0, d2.y0 );
    aux.x1 = min( d1.x1, d2.x1 );
    aux.y1 = min( d1.y1, d2.y1 );
}

int main() {

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

    int i;

    for( i = 0; i < 3; ++i )
        scanf( "%lld %lld %lld %lld", &d[ i ].x0, &d[ i ].y0, &d[ i ].x1, &d[ i ].y1 );

    A = aria( d[ 0 ] ) + aria( d[ 1 ] ) + aria( d[ 2 ] );
    P = perimetru( d[ 0 ] ) + perimetru( d[ 1 ] ) + perimetru( d[ 2 ] );

    reuniune( d[ 0 ], d[ 1 ] );
    A -= aria( aux );
    P -= perimetru( aux );
    reuniune( d[ 0 ], d[ 2 ] );
    A -= aria( aux );
    P -= perimetru( aux );
    reuniune( d[ 1 ], d[ 2 ] );
    A -= aria( aux );
    P -= perimetru( aux );

    reuniune( d[ 0 ], d[ 1 ] );
    reuniune( aux, d[ 2 ] );
    A += aria( aux );
    P += perimetru( aux );

    printf( "%lld %lld", A, P );

    return 0;
}