Cod sursa(job #1200575)

Utilizator hrazvanHarsan Razvan hrazvan Data 22 iunie 2014 21:54:57
Problema Reuniune Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <stdio.h>
typedef struct{
  long long x1, x2, y1, y2;
}dreptunghi;

long long max2(long long a, long long b){
  if(a > b) return a;
  return b;
}
long long min2(long long a, long long b){
  if(a < b) return a;
  return b;
}

long long supr2(dreptunghi a, dreptunghi b, dreptunghi *c){
  (*c).x1 = max2(a.x1, b.x1);
  (*c).x2 = min2(a.x2, b.x2);
  (*c).y2 = min2(a.y2, b.y2);
  (*c).y1 = max2(a.y1, b.y1);
  if((*c).x1 > (*c).x2 || (*c).y2 < (*c).y1) return 0;
  return ((*c).x2 - (*c).x1) * ((*c).y2 - (*c).y1);
}
long long supr3(dreptunghi a, dreptunghi b, dreptunghi c, dreptunghi *e){
  dreptunghi d;
  long long rez;
  rez = supr2(a, b, &d);
  if(rez == 0)  return 0;
  rez = supr2(d, c, e);
  if(rez == 0)  return 0;
  return ((*e).x2 - (*e).x1) * ((*e).y2 - (*e).y1);
}

long long perim2(dreptunghi a, dreptunghi b){
  dreptunghi c;
  supr2(a, b, &c);
  return 2 * (c.x2 - c.x1 + c.y2 - c.y1);
}

long long perim3(dreptunghi a, dreptunghi b, dreptunghi c){
  dreptunghi d;
  supr3(a, b, c, &d);
  return 2 * (d.x2 - d.x1 + d.y2 - d.y1);
}

long long main(){
  FILE *in = fopen("reuniune.in", "r");
  int i;
  dreptunghi dr[3];
  for(i = 0; i < 3; i++){
    fscanf(in, "%lld%lld%lld%lld", &dr[i].x1, &dr[i].y1, &dr[i].x2, &dr[i].y2);
  }
  fclose(in);
  long long supr, perim;
  dreptunghi aux;
  supr = supr2(dr[0], dr[0], &aux) + supr2(dr[1], dr[1], &aux) + supr2(dr[2], dr[2], &aux)
        - supr2(dr[0], dr[1], &aux) - supr2(dr[0], dr[2], &aux) - supr2(dr[1], dr[2], &aux)
        + supr3(dr[0], dr[1], dr[2], &aux);
 perim = perim2(dr[0], dr[0]) + perim2(dr[1], dr[1]) + perim2(dr[2], dr[2])
        - perim2(dr[0], dr[1]) - perim2(dr[0], dr[2]) - perim2(dr[1], dr[2])
        + perim3(dr[0], dr[1], dr[2]);
  FILE *out = fopen("reuniune.out", "w");
  fprintf(out, "%lld %lld", supr, perim);
  fclose(out);
  return 0;
}