Cod sursa(job #324071)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 14 iunie 2009 16:38:03
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>

struct drept
{ int s,d,sus,jos;
};

drept a,b,c,re,re1;
long long arie, perim;

int min( int  a, int b)
{ if(a<b) return a;
 return b;
} 
int max( int a, int b)
{ if(a>b) return a;
  return b;
}


void intersectie(drept x,drept y)
{  
    if(y.s<=x.d&&y.d>=x.s&&y.jos<=x.sus&&y.sus>=x.jos)
     { 
        re.s=max(x.s,y.s);
        re.d=min(x.d,y.d);
        re.jos=max(x.jos,y.jos);
        re.sus=min(x.sus,y.sus);
        arie-=(re.d-re.s)*(re.sus-re.jos);
       perim-=2*(re.d-re.s)+2*(re.sus-re.jos);
     } 
} 

void intersectie1(drept x,drept y)
{ 
    if(y.s<=x.d&&y.d>=x.s&&y.jos<=x.sus&&y.sus>=x.jos)
     { 
        re1.s=max(x.s,y.s);
        re1.d=min(x.d,y.d);
        re1.jos=max(x.jos,y.jos);
        re1.sus=min(x.sus,y.sus);
         arie+=(re1.d-re1.s)*(re1.sus-re1.jos);
         perim+=2*(re1.d-re1.s)+2*(re1.sus-re1.jos);        
     } 
  
}      

int main()
{ freopen("reuniune.in","r",stdin);
  freopen("reuniune.out","w",stdout);
  
  scanf("%d %d %d %d",&a.s,&a.jos,&a.d,&a.sus);
  scanf("%d %d %d %d",&b.s,&b.jos,&b.d,&b.sus);
  scanf("%d %d %d %d",&c.s,&c.jos,&c.d,&c.sus);
    
  
  arie= (a.d-a.s)*(a.sus-a.jos)+(b.d-b.s)*(b.sus-b.jos)+(c.d-c.s)*(c.sus-c.jos);
  perim=2*(a.d-a.s)+2*(a.sus-a.jos)+2*(b.d-b.s)+2*(b.sus-b.jos)+2*(c.d-c.s)+2*(c.sus-c.jos);
  
  intersectie(a,b);
  intersectie(a,c);
  intersectie(b,c);
  intersectie1(re,a);

  printf("%lld ",arie);
  printf("%lld\n",perim);
  
  fclose(stdin);
  fclose(stdout);
  return 0;
}