Cod sursa(job #2119372)

Utilizator marcudanfDaniel Marcu marcudanf Data 1 februarie 2018 00:04:28
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
//sursa ciordita :)) ca nu iesea suta
#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;
}