Cod sursa(job #783010)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 1 septembrie 2012 22:59:29
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

FILE*f=fopen("reuniune.in","r");
FILE*g=fopen("reuniune.out","w");

int x[10],y[10],nrx,nry;

struct drept{
	int x1,y1;
	int x2,y2;
}A[5];

inline void unic ( int *A , int &N ){
	
	int n = 0;
	for ( int i = 1 ; i <= N ; ++i ){
		if ( A[i] != A[i-1] || i == 1 ){
			A[++n] = A[i];
		}
	}
	N = n;
}

inline long long per_inters ( drept A , drept B ){
	
	int X1 = max(A.x1,B.x1),X2 = min(A.x2,B.x2);
	int Y1 = max(A.y1,B.y1),Y2 = min(A.y2,B.y2);
	
	if ( X1 > X2 || Y1 > Y2 )	return 0;
	return X2-X1+Y2-Y1;
}

inline long long per_inters ( drept A , drept B , drept C ){
	
	int X1 = max(A.x1,B.x1),X2 = min(A.x2,B.x2);
	int Y1 = max(A.y1,B.y1),Y2 = min(A.y2,B.y2);
	
	int X3 = max(X1,C.x1),X4 = min(X2,C.x2);
	int Y3 = max(Y1,C.y1),Y4 = min(Y2,C.y2);
	
	if ( X3 > X4 || Y3 > Y4 )	return 0;
	return X4-X3+Y4-Y3;
}

int main () {
	
	for ( int i = 1 ; i <= 3 ; ++i ){
		fscanf(f,"%d %d %d %d",&A[i].x1,&A[i].y1,&A[i].x2,&A[i].y2);
		x[++nrx] = A[i].x1;		x[++nrx] = A[i].x2;
		y[++nry] = A[i].y1;		y[++nry] = A[i].y2;
	}
	
	sort(x+1,x+nrx+1);
	sort(y+1,y+nry+1);
	
	unic(x,nrx);
	unic(y,nry);
	
	long long arie = 0;
	for ( int i = 1 ; i < nrx ; ++i ){
		for ( int j = 1 ; j < nry ; ++j ){
			
			for ( int d = 1 ; d <= 3 ; ++d ){
				if ( A[d].x1 <= x[i] && x[i+1] <= A[d].x2 && A[d].y1 <= y[j] && y[j+1] <= A[d].y2 ){
					arie += 1LL*(x[i+1]-x[i])*(y[j+1]-y[j]);
					break ;
				}
			}
		}
	}
	
	fprintf(g,"%lld ",arie);
	
	long long p = per_inters(A[1],A[1]) + per_inters(A[2],A[2]) + per_inters(A[3],A[3]) - per_inters(A[1],A[2]) - per_inters(A[1],A[3]) - per_inters(A[2],A[3]) + per_inters(A[1],A[2],A[3]);
	fprintf(g,"%lld\n",p<<1);
	
	fclose(f);
	fclose(g);
	
	return 0;
}