Cod sursa(job #1652713)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 15 martie 2016 12:21:55
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<fstream>
#include<vector>

using namespace std;

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

typedef long long i64;

const int inf = (1 << 30) - 1 + (1 << 30);
struct str{
    int x1, x2, y1, y2;
} v[ 4 ];

inline int min2( int a, int b ) {
    return ( a < b ? a : b );
}
inline int max2( int a, int b ) {
    return ( a > b ? a : b );
}
inline str inters( str p, str q ) {
    str ans;
    ans.x1 = max2( p.x1, q.x1 ); ans.y1 = max2( p.y1, q.y1 );
    ans.x2 = min2( p.x2, q.x2 ); ans.y2 = min2( p.y2, q.y2 );
    return ans;
}
inline void init( str &s ) {
    s.x1 = s.y1 = -inf;
    s.x2 = s.y2 = inf;
}
inline str sol( int a, int b, int c ) {
    str s;
    init( s );
    s = inters( s, v[ a ] );
    s = inters( s, v[ b ] );
    s = inters( s, v[ c ] );
    return s;
}
inline i64 arie( int a, int b, int c ) {
    str s = sol( a, b, c );
    if ( s.x1 < s.x2 && s.y1 < s.y2 ) {
        return 1LL * (s.x2 - s.x1) * (s.y2 - s.y1);
    }
    return 0;
}
inline i64 peri( int a, int b, int c ) {
    str s = sol( a, b, c );
    if ( s.x1 < s.x2 && s.y1 < s.y2 ) {
        return 2 * 1LL * ( s.x2 - s.x1 + s.y2 - s.y1 );
    }
    return 0;
}
int main() {
    init( v[ 0 ] );
    for( int i = 1; i <= 3; ++ i ) {
        fin >> v[ i ].x1 >> v[ i ].y1 >> v[ i ].x2 >> v[ i ].y2;
    }
    fout << arie( 0, 0, 1 ) + arie( 0, 0, 2 ) + arie( 0, 0, 3 )
            - arie( 0, 1, 2 ) - arie( 0, 1, 3 ) - arie( 0, 2, 3 ) + arie( 1, 2, 3 ) << " ";
    fout << peri( 0, 0, 1 ) + peri( 0, 0, 2 ) + peri( 0, 0, 3 )
            - peri( 0, 1, 2 ) - peri( 0, 1, 3 ) - peri( 0, 2, 3 ) + peri( 1, 2, 3 ) << "\n";
    fin.close();
    fout.close();
    return 0;
}