Cod sursa(job #1044780)

Utilizator ELHoriaHoria Cretescu ELHoria Data 30 noiembrie 2013 12:54:23
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <sstream>

using namespace std;

class Rectangle {
    public:
    int xLeft, yDown;
    int xRight, yUp;
    Rectangle(int xa = 0,int ya = 0,int xb = 0,int yb = 0) {
        xLeft = xa;
        yDown = ya;
        xRight = xb;
        yUp = yb;
    }
    
    Rectangle(const Rectangle &R) {
        xLeft = R.xLeft;
        yDown = R.yDown;
        xRight = R.xRight;
        yUp = R.yUp;
    }

    long long getArea() {
        return 1LL * (xRight - xLeft) * (yUp - yDown);
    }

    long long getPerimeter() {
        return 2LL * (xRight - xLeft + yUp - yDown);
    }

    void getIntersection(const Rectangle &r) {
        xLeft = max(xLeft,r.xLeft);
        yDown = max(yDown,r.yDown);
        xRight = min(xRight,r.xRight);
        yUp = min(yUp,r.yUp);
        if (xLeft > xRight || yDown > yUp) {
            xLeft = xRight = 0;
            yDown = yUp = 0;
        }
    }

    friend istream& operator >> (istream &in,Rectangle &R) {
        in >> R.xLeft >> R.yDown >> R.xRight >> R.yUp;
        return in;
    }

    friend ostream& operator << (ostream &out,const Rectangle &R) {
        out << R.xLeft << " " << R.yDown << " " << R.xRight << " " << R.yUp;
        return out;
   }
};


int main()
{   
    ifstream cin("reuniune.in");
    ofstream cout("reuniune.out");
    const int nmax = 3;
    Rectangle r[nmax];
    int n = 3;
    for (int i = 0;i < n;i++) {
        cin >> r[i];
    }
    
    long long intersectionArea = 0;
    long long intersectionPerimeter = 0;
    for (int i = 1;i < (1 << n);i++) {
        int bitCount = 0;
        Rectangle intersectionRectangle(-int(1e9),-int(1e9),int(1e9),int(1e9));
        for (int j = 0;j < n;j++) {
            if ( (i >> j) & 1) {
                bitCount++;
                intersectionRectangle.getIntersection(r[j]);
            }
        }
        
        if (bitCount & 1) {
            intersectionArea += intersectionRectangle.getArea(); 
            intersectionPerimeter += intersectionRectangle.getPerimeter();
        } else {
            intersectionArea -= intersectionRectangle.getArea(); 
            intersectionPerimeter -= intersectionRectangle.getPerimeter();
        }
    }

    cout << intersectionArea << " " << intersectionPerimeter << "\n";
    return 0;
}