Cod sursa(job #2336238)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 4 februarie 2019 22:04:24
Problema Reuniune Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define fi first
#define se second
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'

using namespace std;

typedef pair <int, int> pii;
typedef vector <int> vi;
typedef long long ll;
typedef unsigned long long ull;

struct Rectangle {
  int x0, y0, x1, y1;
  Rectangle intersect (const Rectangle &other) {
    Rectangle ret;
    ret.x0 = max (x0, other.x0);
    ret.y0 = max (y0, other.y0);
    ret.x1 = min (x1, other.x1);
    ret.y1 = min (y1, other.y1);
    if (x0 > x1 || y0 > y1) return {0, 0, 0, 0};
    return ret;
  }
  ll getArea() {
    return 1LL * (x1 - x0) * (y1 - y0);
  }
  ll getPerimeter() {
    return 2LL * (x1 - x0) + 2LL * (y1 - y0);
  }
};

Rectangle rectangle[4];

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
#ifdef LOCAL_DEFINE
  freopen (".in", "r", stdin);
#endif

  freopen ("reuniune.in", "r", stdin);
  freopen ("reuniune.out", "w", stdout);

  for (int i = 1; i <= 3; ++i) {
    int x0, y0, x1, y1;
    scanf ("%d%d%d%d", &x0, &y0, &x1, &y1);
    rectangle[i] = {x0, y0, x1, y1};
  }

  ll area = 0, perimeter = 0;
  for (int i = 1; i <= 3; ++i) {
    area += rectangle[i].getArea();
    perimeter += rectangle[i].getPerimeter();
  }
  for (int i = 1; i <= 3; ++i) {
    for (int j = i + 1; j <= 3; ++j) {
      Rectangle intersection = rectangle[i].intersect (rectangle[j]);
      area -= intersection.getArea();
      perimeter -= intersection.getPerimeter();
    }
  }

  Rectangle intersection = (rectangle[1].intersect (rectangle[2])).intersect (rectangle[3]);
  area += intersection.getArea();
  perimeter += intersection.getPerimeter();

  printf ("%lld %lld\n", area, perimeter);

  fclose (stdin);
  fclose (stdout);

#ifdef LOCAL_DEFINE
  fprintf (stderr, "Time elapsed: %lf s.\n", 1.0 * clock() / CLOCKS_PER_SEC);
#endif
  return 0;
}