Cod sursa(job #2108247)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 18 ianuarie 2018 00:39:17
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>
using namespace std;

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

#define x first
#define y second

const int N = 3;

struct Dreptunghi
{
    pair<int, int> sus, jos;

    Dreptunghi(){}
    Dreptunghi(pair<int, int> _sus, pair<int, int> _jos) : sus(_sus), jos(_jos) {}

    Dreptunghi intersectie(const Dreptunghi& other)
    {
        Dreptunghi ans;
        ans.jos.x = max(jos.x, other.jos.x);
        ans.jos.y = max(jos.y, other.jos.y);
        ans.sus.x = min(sus.x, other.sus.x);
        ans.sus.y = min(sus.y, other.sus.y);

        if(ans.jos.x > ans.sus.x || ans.jos.y > ans.sus.y)
            ans = Dreptunghi({0, 0}, {0, 0});

        return ans;
    }

    long long arie()
    {
        return 1LL * (sus.x - jos.x) * (sus.y - jos.y);
    }

    long long perimetru()
    {
        return 2LL * (sus.x - jos.x) + 2LL * (sus.y - jos.y);
    }

};

Dreptunghi d[2 * N + 2];

long long ansArie, ansPer;

int main()
{
    int len = N;

    for(int i = 1; i <= N; i++)
    {
        pair<int, int> sus, jos;
        in >> jos.x >> jos.y >> sus.x >> sus.y;
        d[i] = Dreptunghi(sus, jos);
    }

    for(int i = 1; i <= N; i++)
    for(int j = i + 1; j <= N; j++)
        d[++len] = d[i].intersectie(d[j]);

    d[++len] = d[1].intersectie(d[2]).intersectie(d[3]);


    for(int i = 1; i < len; i++)
        if(i <= 3)
            ansArie += d[i].arie();
        else ansArie -= d[i].arie();

    ansArie += d[len].arie();

    for(int i = 1; i < len; i++)
        if(i <= 3)
            ansPer += d[i].perimetru();
        else ansPer -= d[i].perimetru();

    ansPer += d[len].perimetru();

    out << ansArie << ' ' << ansPer << '\n';

    return 0;
}