Cod sursa(job #2647448)

Utilizator victorzarzuZarzu Victor victorzarzu Data 4 septembrie 2020 17:52:35
Problema Reuniune Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>

#define max_coord 1e9 + 5
#define point pair<long long, long long>
#define x first
#define y second

using namespace std;
ifstream f("reuniune.in");
ofstream g("reuniune.out");

struct rect
{
  point down, up;
};

vector<rect> r;
point r1, r2;
unsigned long long ar, per;

unsigned long long arie(rect r1)
{
  return 1LL * (r1.up.x - r1.down.x) * (r1.up.y - r1.down.y);
}

unsigned long long perimetru(rect r1)
{
  return 2 * (r1.up.x - r1.down.x) + 2 * (r1.up.y - r1.down.y);
}

rect intersect(rect r1, rect r2)
{
  point d, u;
  d = {max(r1.down.x, r2.down.x), max(r1.down.y, r2.down.y)};
  u = {min(r1.up.x, r2.up.x), min(r1.up.y, r2.up.y)};

  return {d, u};
}

void Read()
{
  for(int i = 1;i <= 3;++i)
  {
    f>>r1.x>>r1.y>>r2.x>>r2.y;
    r.push_back({r1, r2});
  }
} void Solve()
{
  for(int i = 1;i < (1 << 3);++i)
  {
    rect inter = {make_pair(-max_coord, -max_coord), make_pair(max_coord, max_coord)};
    long long nr = 0;
    for(int j = 0;j < 3;++j)
      if((1 << j) & i)
      {
        inter = intersect(r[j], inter);
        ++nr;
      }
    
    nr = (nr % 2 == 0) ? -1 : 1;
    ar += nr * arie(inter);
    per += nr * perimetru(inter);
  }
  g<<ar<<" "<<per;
}

int main()
{
  Read();
  Solve();
  return 0;
}