Cod sursa(job #1826395)

Utilizator raducostacheRadu Costache raducostache Data 10 decembrie 2016 13:27:18
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <cstdio>
#include <algorithm>
#include <iostream>

#define mp make_pair
#define fs first
#define sc second

using namespace std;

long long s,p;
int k;

pair <int,int> a[3][2];
pair <int,int> it[4][2];

void perimetru()
{
    int i;
    for (i = 0; i< 3; ++i)
        p += 2LL * ((long long)(a[i][1].fs - a[i][0].fs) + (a[i][1].sc - a[i][0].sc));
    for (i = 0; i < k; ++i)
    {
        if (it[i][1].fs >= it[i][0].fs && it[i][1].sc >= it[i][0].sc)
            p -= 2LL * ((long long) it[i][1].fs - it[i][0].fs + it[i][1].sc - it[i][0].sc);
    }
    if (it[k][1].fs >= it[k][0].fs && it[k][1].sc >= it[k][0].sc)
        p += 2LL * ((long long) it[k][1].fs - it[k][0].fs + it[k][1].sc - it[k][0].sc);

}

void arie()
{
    int i;
    long long j = 0;
    for (i = 0; i < 3; ++i)
        if (a[i][1].fs - a[i][0].fs > 0 && a[i][1].sc - a[i][0].sc > 0)
            s += 1LL * ((long long)a[i][1].fs - a[i][0].fs) * ((long long)a[i][1].sc - a[i][0].sc);
    for (i = 0; i < k ; ++i)
        if (it[i][1].fs - it[i][0].fs > 0 && it[i][1].sc - it[i][0].sc > 0)
            s -= 1LL * ((long long)it[i][1].fs - it[i][0].fs ) * ((long long)it[i][1].sc - it[i][0].sc );
    if (it[k][1].fs > it[k][0].fs && it[k][1].sc > it[k][0].sc)
        s += 1LL * (it[k][1].fs - it[k][0].fs) * (it[k][1].sc - it[k][0].sc);
}
int main()
{
    int i,j;
    freopen("reuniune.in","r",stdin);
    for (i = 0; i < 3; ++i)
        for (j = 0; j < 2; ++j)
            scanf("%d%d", &a[i][j].fs, &a[i][j].sc);
    for (i = 0; i < 3; ++i)
        for (j = i + 1; j < 3; ++j)
        {
            it[k][0] = mp( max(a[i][0].fs, a[j][0].fs), max(a[i][0].sc, a[j][0].sc));
            it[k++][1] = mp( min(a[i][1].fs, a[j][1].fs), min(a[i][1].sc, a[j][1].sc));
        }
    it[k][0] = mp(- 2000000000, - 2000000000);
    it[k][1] = mp(2000000000,2000000000);
    for (i = 0; i < k ; ++i)
    {
        if (it[i][0] > it[k][0])
            it[k][0] = it[i][0];
        if (it[i][1] < it[k][1])
            it[k][1] = it[i][1];
    }
    perimetru();
    arie();
    freopen("reuniune.out","w",stdout);
    cout << s << " " << p << "\n";
}