Cod sursa(job #1561839)

Utilizator stoianmihailStoian Mihail stoianmihail Data 4 ianuarie 2016 16:46:15
Problema Reuniune Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>

#define ll long long

typedef struct {
  int x, y;
} pair;

typedef struct {
  pair down, up;
} cell;

cell empty;

/** MIN(X, Y). **/
int MIN(int X, int Y) {
  return X < Y ? X : Y;
}

/** max(X, Y). **/
int MAX(int X, int Y) {
  return X > Y ? X : Y;
}

/** Citeste dreptunghiul "d". **/
void read(cell *d, FILE *f) {
  fscanf(f, "%d %d %d %d", &d -> down.x, 
                           &d -> down.y, 
                           &d -> up.x, 
                           &d -> up.y); 
}

/** Perimetrul dreptunghiului "d". **/
ll int perimeter(cell *d) {
  return (ll)2 * (d -> up.x - d -> down.x + d -> up.y - d -> down.y);
}

/** Aria dreptunghiului "d". **/
ll int area(cell *d) {
  return (ll)(d -> up.x - d -> down.x) * (d -> up.y - d -> down.y);
}

/** Intersectia dreptunghiurilor "A" si "B". **/
cell intersect(cell *A, cell *B) {
  cell curr;

  curr.down.x = MAX(A -> down.x, B -> down.x);
  curr.down.y = MAX(A -> down.y, B -> down.y);
  curr.up.x = MIN(A -> up.x, B -> up.x);
  curr.up.y = MIN(A -> up.y, B -> up.y);

  if ((curr.down.x > curr.up.x) || (curr.down.y > curr.up.y)) {
    curr = empty;
  }
  return curr;
}

int main(void) {
  cell d_0, d_1, d_2, d_01, d_02, d_12, d_012;
  FILE *f = fopen("reuniune.in", "r");

  /* Citirea datelor. */
  read(&d_0, f);
  read(&d_1, f);
  read(&d_2, f);
  fclose(f);

  /* Calcularea solutiei. */
  d_01 = intersect(&d_0, &d_1);
  d_02 = intersect(&d_0, &d_2);
  d_12 = intersect(&d_1, &d_2);
  d_012 = intersect(&d_01, &d_2);
  
  ll int p = perimeter(&d_0) + perimeter(&d_1) + perimeter(&d_2) 
             - perimeter(&d_01) - perimeter(&d_02) - perimeter(&d_12) 
             + perimeter(&d_012);
  ll int a = area(&d_0) + area(&d_1) + area(&d_2)
             - area(&d_01) - area(&d_02) - area(&d_12)
             + area(&d_012);

  /* Afisarea solutiei. */
  freopen("reuniune.out", "w", stdout);
  fprintf(stdout, "%lld %lld\n", a, p);
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}