Cod sursa(job #430578)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 31 martie 2010 10:24:15
Problema Reuniune Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.97 kb
#include <iostream>
#include <fstream.h>
#define LL long long

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

struct dr{ LL x[4],y[4]; } d[5];

LL arie_tot,per_tot;
int i,ok;

inline LL abs(LL x){ return x>0 ? x:-x; }
inline LL Minim(LL x,LL y){ return x<y ? x:y; }
inline LL Maxim(LL x,LL y){ return x>y ? x:y; }

inline LL Arie(LL x0, LL y0, LL x1, LL y1){
	return  abs(x0-x1)*abs(y0-y1);
}
inline LL Perimetru(LL x0, LL y0, LL x1, LL y1){
	return abs(x0-x1)*2 + abs(y0-y1)*2;
}

inline LL e_in(LL x,LL y, int j){
	if( d[j].x[0] <= x && x<=d[j].x[1] 
		&& d[j].y[0]<=y && y<=d[j].y[1] ) return 1;
	return 0;
}

int ap(int i,int j){
	int cine,k,kk,c;
	LL per=0,ar=0,x,y;
	cine=-1;
	
	for(k=0;k<4;++k)
		if( e_in(d[i].x[k],d[i].y[k],j) ){ 
			cine=k; 
			if(k & 1){
				kk=0; c=1;
				x=Maxim(d[j].x[kk],d[i].x[kk]);
				if(k==3) y=Minim(d[j].y[c],d[i].y[c]);
				else y=Maxim(d[j].y[kk],d[i].y[kk]);
			}else{
				kk=1; c=0;
				x=Minim(d[j].x[kk],d[i].x[kk]);
				if(k==2) y=Maxim(d[j].y[c],d[i].y[c]);
				else y=Minim(d[j].y[kk],d[i].y[kk]);
			}
			break;
		}
	if(cine==-1)return 0;//{ // ar putea fi adiacente
		//if(ok) return 0; // am scos/pus deja perimetrul
	/*per=0;
		if(d[i].y[0]==d[j].y[1] || d[i].y[1]==d[j].y[0])
			if(d[j].x[0] <= d[i].x[1] && d[i].x[1]<=d[j].x[1])
				per+=abs(d[i].x[1]-Maxim(d[i].x[0],d[j].x[0])),ok=1;else
			if(d[j].x[0] <= d[i].x[0] && d[i].x[1]<=d[j].x[1])
				per+=abs(d[i].x[0]-Minim(d[i].x[1],d[j].x[1])),ok=1;

		if(d[i].x[0]==d[j].x[1] || d[i].x[1]==d[j].x[0])
			if(d[j].y[0] <= d[i].y[1] && d[i].y[1]<=d[j].y[1])
				per+=abs(d[i].y[1]-Maxim(d[i].y[0],d[j].y[0])),ok=1;else
			if(d[j].y[0] <= d[i].y[0] && d[i].y[1]<=d[j].y[1])
				per+=abs(d[i].y[0]-Minim(d[i].y[1],d[j].y[1])),ok=1;
		
	per_tot+=per;*/
		
	
	ar=Arie(x,y,d[i].x[cine],d[i].y[cine]); 
	per=Perimetru(x,y,d[i].x[cine],d[i].y[cine]); 
	//if(ar==0) per/=2;

	if(j!=4){
		arie_tot-=ar;
		per_tot-=per;
	}
	else{
		arie_tot+=ar;
		per_tot+=per;
	}
	
	if(i==1 && j==2){
		d[4].x[cine]=d[i].x[cine];  // in 4 sunt coord pt drept int 1 cu 2
		d[4].y[cine]=d[i].y[cine];
		if(cine==1 || cine==3) kk=cine-1;
		else kk=cine+1;
		d[4].x[kk]=x;
		d[4].y[kk]=y;
		if(d[4].x[0])d[4].x[2]=d[4].x[0], d[4].y[2]=d[4].y[1];
		if(d[4].x[1])d[4].x[3]=d[4].x[1], d[4].y[3]=d[4].y[0];
		if(d[4].x[2])d[4].x[0]=d[4].x[2], d[4].y[0]=d[4].y[3];
		if(d[4].x[3])d[4].x[1]=d[4].x[3], d[4].y[1]=d[4].y[2];

	}
	return 1;
}


int main(){
	
	for(i=1;i<=3;++i){
		fin>>d[i].x[0]>>d[i].y[0]>>d[i].x[1]>>d[i].y[1];

		d[i].x[2]=d[i].x[0]; d[i].y[2]=d[i].y[1];
		d[i].x[3]=d[i].x[1]; d[i].y[3]=d[i].y[0];
		
		arie_tot+=Arie(d[i].x[0],d[i].y[0],d[i].x[1],d[i].y[1]);
		per_tot+=Perimetru(d[i].x[0],d[i].y[0],d[i].x[1],d[i].y[1]);
	}
	
	ok=0; if(!ap(1,2)) ap(2,1); 
	ok=0; if(!ap(1,3)) ap(3,1);
	ok=0; if(!ap(2,3)) ap(3,2);
	ok=0; if(!ap(3,4)) ap(4,3);
	
	fout<<arie_tot<<" "<<per_tot<<"\n";
	fin.close(); fout.close();
	return 0;
}