Cod sursa(job #2655368)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 4 octombrie 2020 10:43:42
Problema Reuniune Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
ifstream f("reuniune.in");
ofstream g("reuniune.out");
struct point{
  long long x, y;
};

struct dreptunghi{
  point a, b;
};
dreptunghi d[3];



long long arie(dreptunghi d)
{
  return abs(d.a.x - d.b.x) * abs(d.a.y - d.b.y);
}
long long perimetru(dreptunghi d)
{
    if (d.a.x-d.b.x==0) return d.a.y-d.b.y;
    else if (d.a.y-d.b.y==0) return d.a.x-d.b.x;
    return abs(d.a.x - d.b.x) * 2 + abs(d.a.y - d.b.y) * 2;
}
//https://www.geeksforgeeks.org/intersecting-rectangle-when-bottom-left-and-top-right-corners-of-two-rectangles-are-given/
dreptunghi intersectie(dreptunghi d1, dreptunghi d2)
{
  long long xa = max(d1.a.x, d2.a.x);
  long long ya = max(d1.a.y, d2.a.y);
  long long xb = min(d1.b.x, d2.b.x);
  long long yb = min(d1.b.y, d2.b.y);

  dreptunghi d;
  d.a.x = 0;
  d.a.y = 0;
  d.b.x = 0;
  d.b.y = 0;

  if (xa >= xb || ya >= yb)
    return d;

  d.a.x = xa;
  d.a.y = ya;
  d.b.x = xb;
  d.b.y = yb;

  return d;

  // 1 1 3 3
  // 5 5 6 6
  //xa = 5, xb = 3
}
long long arie_perimetru(long long (*f)(dreptunghi), dreptunghi d[]) {

  return f(d[0]) + f(d[1]) + f(d[2])
      - f(intersectie(d[0],d[1])) - f(intersectie(d[1],d[2]))
      - f(intersectie(d[2],d[0])) + f(intersectie(d[0], intersectie(d[1],d[2])));
}


int main()
{
  long long i, j;
  for (i = 0; i < 3; i++) {
    f >> d[i].a.x >> d[i].a.y;
    f >> d[i].b.x >> d[i].b.y;}
  long long a = arie_perimetru(arie, d);
  long long p = arie_perimetru(perimetru, d);
    g<< a << ' ' << p << '\n';
  return 0;
}