Cod sursa(job #2837856)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 22 ianuarie 2022 18:51:14
Problema Reuniune Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>

static inline int max( int a, int b ) {
	return ( a >= b ? a : b );
}

static inline int min( int a, int b ) {
	return ( a <= b ? a : b );
}

struct Andrei {
	int i1, i2;
	int j1, j2;
};

unsigned long long arie( const Andrei& A ) {
	if( A.i2 <= A.i1 )
		return 0LL;
	if( A.j2 <= A.j1 )
		return 0LL;
	return ( unsigned long long )( A.i2 - A.i1 ) * ( A.j2 - A.j1 );
}

unsigned long long per( const Andrei& A ) {
	if( A.i2 <= A.i1 )
		return 0LL;
	if( A.j2 <= A.j1 )
		return 0LL;
	return ( unsigned long long )( A.i2 - A.i1 + A.j2 - A.j1 ) * 2;
}

Andrei make( const Andrei& A, const Andrei& B ) {
	Andrei C;
	C.i1 = max( A.i1, B.i1 );
	C.i2 = min( A.i2, B.i2 );
	C.j1 = max( A.j1, B.j1 );
	C.j2 = min( A.j2, B.j2 );

	return C;
}

int main()
{
	Andrei A, B, C;
	FILE *fin = fopen( "reuniune.in", "r" );
	fscanf( fin, "%d %d %d %d", &A.i1, &A.j1, &A.i2, &A.j2 );
	fscanf( fin, "%d %d %d %d", &B.i1, &B.j1, &B.i2, &B.j2 );
	fscanf( fin, "%d %d %d %d", &C.i1, &C.j1, &C.i2, &C.j2 );
	fclose( fin );

	int up = min( A.i1, min( B.i1, C.i1 ) );
	int down = max( A.i2, max( B.i2, C.i2 ) );

	int left = min( A.j1, min( B.j1, C.j1 ) );
	int right = max( A.j2, max( B.j2, C.j2 ) );
 	
	Andrei D = make( A, B );
	Andrei E = make( B, C );
	Andrei G = make( A, C );
	Andrei F = make( D, E );

	unsigned long long perimetru = per( A ) + per( B ) + per( C ) - per( E ) - per( D ) - per( G ) + per( F );
	unsigned long long Arie = arie( A ) + arie( B ) + arie( C ) - arie( D ) - arie( G ) - arie( E ) + arie( F );


	FILE *fout = fopen( "reuniune.out", "w" );
	fprintf( fout, "%llu %llu\n", Arie, perimetru );
	fclose( fout );
 	return 0;
}