Cod sursa(job #3340334)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 13 februarie 2026 18:46:18
Problema Reuniune Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>
#define ll long long
#define int long long

using namespace std;

const int INF = 1e18;

ifstream fin("reuniune.in");
ofstream fout("reuniune.out");

int X0[3], Y0[3], X1[3], Y1[3];
ll area, perimeter;

signed main() {
//    ios::sync_with_stdio(0);
//    cin.tie(0);
//    cout.tie(0);

    for(int i = 0; i < 3; i++) {
        fin >> X0[i] >> Y0[i] >> X1[i] >> Y1[i];
//        if(X0[i] > X1[i]) {
//            swap(X0[i], X1[i]);
//            swap(Y0[i], Y1[i]);
//        }
//        else if(X0[i] == X1[i] && Y0[i] > Y1[i]) {
//            swap(Y0[i], Y1[i]);
//        }
    }

//    xminren = yminren = INF + 1;
//    xmaxren = ymaxren = -INF - 1;
//    for(int i = 0; i < 3; i++) {
//        xminren = min(xminren, X0[i]);
//        xmaxren = max(xmaxren, X1[i]);
//        yminren = min(yminren, Y0[i]);
//        ymaxren = max(ymaxren, Y1[i]);
//    }

    for(int mask = 1; mask < (1 << 3); mask++) {
        int xmininter, xmaxinter, ymininter, ymaxinter;
        int xminren, xmaxren, yminren, ymaxren;
        xmininter = ymininter = -INF - 1;
        xmaxinter = ymaxinter = INF + 1;
        xminren = yminren = INF + 1;
        xmaxren = ymaxren = -INF - 1;

        for(int i = 0; i < 3; i++) {
            if(mask >> i & 1) {
                xminren = min(xminren, X0[i]);
                xmaxren = max(xmaxren, X1[i]);
                yminren = min(yminren, Y0[i]);
                ymaxren = max(ymaxren, Y1[i]);

                xmininter = max(xmininter, X0[i]);
                xmaxinter = min(xmaxinter, X1[i]);
                ymininter = max(ymininter, Y0[i]);
                ymaxinter = min(ymaxinter, Y1[i]);
            }
        }

//        cout << bitset<3>(mask) << '\n';
//        cout << xmininter << ' ' << xmaxinter << ' ' << ymininter << ' ' << ymaxinter << '\n';

        int sign = (__builtin_popcount(mask) % 2 == 1 ? 1 : -1);
        if(xmininter <= xmaxinter && ymininter <= ymaxinter) {
//            cout << "GIGEL\n";
            area += sign * (ll)(ymaxinter - ymininter) * (xmaxinter - xmininter);
            perimeter += sign * 2 * (xmaxinter - xmininter + ymaxinter - ymininter);
        }
    }

    fout << area << ' ' << perimeter << '\n';

    return 0;
}