Cod sursa(job #1334076)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 3 februarie 2015 21:24:12
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
using namespace std;

const int INF = 0x3f3f3f3f;

int N;
int v[4][4];
long long A, P;

inline long long getArea(int conf) {
    int x1 = -INF, x2 = INF, y1 = -INF, y2 = INF;
    long long ret = 0;

    for(int i = 0; i < N; ++i)
        if(conf & (1 << i)) {
            x1 = max(x1, v[i + 1][0]);
            x2 = min(x2, v[i + 1][2]);
            y1 = max(y1, v[i + 1][1]);
            y2 = min(y2, v[i + 1][3]);
        }

    if(x1 <= x2 && y1 <= y2)
        ret = 1LL * (x2 - x1) * (y2 - y1);

    return ret;
}

inline long long getPerimeter(int conf) {
    int x1 = -INF, x2 = INF, y1 = -INF, y2 = INF;
    long long ret = 0;

    for(int i = 0; i < N; ++i)
        if(conf & (1 << i)) {
            x1 = max(x1, v[i + 1][0]);
            x2 = min(x2, v[i + 1][2]);
            y1 = max(y1, v[i + 1][1]);
            y2 = min(y2, v[i + 1][3]);
        }

    if(x1 <= x2 && y1 <= y2)
        ret = 2LL * ((x2 - x1) + (y2 - y1));

    return ret;
}

int main() {
    ifstream f("reuniune.in");
    ofstream g("reuniune.out");

    N = 3;
    for(int i = 1; i <= N; ++i)
        for(int j = 0; j < 4; ++j)
            f >> v[i][j];

    for(int conf = 1; conf < (1 << N); ++conf) {
        int cnt = 0, last = 0;

        for(int i = 0; i < N; ++i)
            if(conf & (1 << i))
                ++cnt;

        long long a = getArea(conf), p = getPerimeter(conf);

        if(cnt % 2) {
            A += a;
            P += p;
        }
        else {
            A -= a;
            P -= p;
        }
    }

    g << A << " " << P << "\n";

    f.close();
    g.close();

    return 0;
}