Cod sursa(job #1452012)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 19 iunie 2015 15:24:55
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>

#define MIN(A, B) ((A) < (B) ? (A) : (B))
#define MAX(A, B) ((A) > (B) ? (A) : (B))

typedef struct {
  int x0, y0; // stanga jos
  int x1, y1; // dreapta sus
} retangle;

inline int surface(const retangle &a) {
  int s = (a.x1 - a.x0) * (a.y1 - a.y0);
  return s & -(s > 0);
}

inline int perimiter(const retangle &a) {
  int p = (a.x1 - a.x0 + a.y1 - a.y0) << 1;
  return p & -(p > 0);
}

inline retangle intersect(const retangle &a, retangle &b) {
  retangle c;

  c.x0 = MAX(a.x0, b.x0);
  c.y0 = MAX(a.y0, b.y0);
  c.x1 = MIN(a.x1, b.x1);
  c.y1 = MIN(a.y1, b.y1);

  return c;
}

int main(void) {
  FILE *f = fopen("reuniune.in", "r");
  retangle a, b, c;

  fscanf(f, "%d%d%d%d%d%d%d%d%d%d%d%d", &a.x0, &a.y0, &a.x1, &a.y1, &b.x0, &b.y0, &b.x1, &b.y1, &c.x0, &c.y0, &c.x1, &c.y1);
  fclose(f);

  f = fopen("reuniune.out", "w");
  fprintf(f, "%d %d\n", surface(a) + surface(b) + surface(c) - surface(intersect(a, b)) - surface(intersect(a, c)) - surface(intersect(b, c)) + surface(intersect(intersect(a, b), c)),
                        perimiter(a) + perimiter(b) + perimiter(c) - perimiter(intersect(a, b)) - perimiter(intersect(a, c)) - perimiter(intersect(b, c)) + perimiter(intersect(intersect(a, b), c)));
  fclose(f);
  return 0;
}