Cod sursa(job #503921)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 25 noiembrie 2010 18:21:28
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define inf 1<<29
FILE*f=fopen("reuniune.in","r");
FILE*g=fopen("reuniune.out","w");

int i,lin[20],col[20],L[20],C[20],k,p,k2,p2,A[20][20],d,j;
long long S,P;

int di[4] = {0,0,1,-1};
int dj[4] = {1,-1,0,0};

struct pct{
	int x1; int y1; int x2; int y2;
} W[5];

void fill ( int i ,int j,int d ){
	if ( !(i >= 0 && i <= k2 && j >= 0 && j <= p2 ) || A[i][j] == -inf )
		return ;
	if ( A[i][j] > 0 ){
		if ( d > 1 ){
			P += ((long long)(C[j+1] - C[j]));
		}
		else
			P += ((long long)(L[i+1] - L[i]));
		return ;
	}
	for ( int dd = 0 ; dd < 4 ; ++dd ){
		A[i][j] = -inf;
		fill(i+di[dd],j+dj[dd],dd);
	}
	
}


int main () {
	
	for ( i = 1 ; i <= 3 ; ++i ){
		fscanf(f,"%d %d %d %d",&W[i].x1,&W[i].y1,&W[i].x2,&W[i].y2);
		lin[++k] = W[i].x1; lin[++k] = W[i].x2;
		col[++p] = W[i].y1; col[++p] = W[i].y2;
	}
	sort(lin+1,lin+k+1); sort(col+1,col+k+1);
	lin[0] = col[0] = -1<<29;
	for ( i = 1 ; i <= k ; ++ i ){
		if ( lin[i] != lin[i-1] )
			L[++k2] = lin[i];
		if ( col[i] != col[i-1] )
			C[++p2] = col[i];
	}
	
	for ( i = 1 ; i < k2 ; ++i ){
		for ( j = 1 ; j < p2; ++j ){
			
			for ( d = 1 ; d <= 3 ; ++d ){
				if ( L[i] >= W[d].x1 && L[i+1] <= W[d].x2 && C[j] >= W[d].y1 && C[j+1] <= W[d].y2 ){
					++A[i][j] ;
				}
				
			}
			
		}
	}
	
	for ( i = 1 ; i < k2 ; ++i ){
		for ( j = 1 ; j < p2; ++j ){
			if ( A[i][j] > 0 ){
				S += (long long)( L[i+1] - L[i] ) * ( C[j+1] - C[j] );
			}
		}
	}
	fill(0,0,0);	
	
	fprintf(g,"%lld %lld\n",S,P); 
	
	fclose(f);
	fclose(g);
	
	return 0;
}