Cod sursa(job #660539)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 13 ianuarie 2012 04:58:02
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include <algorithm>

#define FISIN   "reuniune.in"
#define FISOUT  "reuniune.out"

struct Range {
  Range(long long aa, long long bb) : a(aa), b(bb) { } 
  long long a, b;

  long long len() const { return b - a; }

  Range i(const Range& r) {
    long long new_min = std::max<long long>(a, r.a);
    long long new_max = std::min<long long>(b, r.b);
    if (new_max <= new_min) new_min = new_max = 0;
    return Range(new_min, new_max);
  }
};

struct Rectangle {
  Rectangle(int a = 0, int b = 0, int c = 0, int d = 0)
    : minx(a), miny(b), maxx(c), maxy(d) {}
  long long minx, miny, maxx, maxy;

  long long perim() const {
    return 2 * ((maxx - minx) + (maxy - miny));
  }

  long long arie() const {
    return (maxx - minx) * (maxy - miny);
  }

  Rectangle i(const Rectangle& r) const {
    Range rx = Range(minx, maxx).i(Range(r.minx, r.maxx));
    Range ry = Range(miny, maxy).i(Range(r.miny, r.maxy));
    if (!rx.len() || !ry.len()) return Rectangle();
    return Rectangle(rx.a, ry.a, rx.b, ry.b);
  }
} a, b, c;

void read_rect(FILE *f, Rectangle* r) {
  int a, b, c, d;
  fscanf(f, "%d %d %d %d", &a, &b, &c, &d);
  *r = Rectangle(a, b, c, d);
}

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");

  read_rect(fin, &a);
  read_rect(fin, &b);
  read_rect(fin, &c);

  long long arie
    = a.arie() + b.arie() + c.arie()
    - a.i(b).arie() - a.i(c).arie() - b.i(c).arie()
    + a.i(b).i(c).arie();

  long long perim
    = a.perim() + b.perim() + c.perim()
    - a.i(b).perim() - a.i(c).perim() - b.i(c).perim()
    + a.i(b).i(c).perim();

  fprintf(fout, "%lld %lld\n", arie, perim);

  fclose(fout);
  fclose(fin);
  return 0;
}