Cod sursa(job #266007)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 24 februarie 2009 20:25:38
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.97 kb
#include <cstdio>
#include <algorithm>
#include <iostream>
#define FIN "reuniune.in"
#define FOUT "reuniune.out"
using namespace std;
long long s,p;
int k;
pair <int,int> a[3][2];
pair <int,int> it[4][2];
void read()
{
	int i,j;
	freopen(FIN,"r",stdin);
	for (i = 0; i < 3; ++i)
		for (j = 0; j < 2; ++j)
			scanf("%d %d", &a[i][j].first, &a[i][j].second);
}
int maxim(int a, int b)
{
	return a > b ? a : b;
}
int minim(int a,int b)
{
	return a < b ? a : b;
}

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

}

void arie()
{
    int i,j = 0;
    for (i = 0; i < 3; ++i)
		if (a[i][1].first - a[i][0].first > 0 && a[i][1].second - a[i][0].second > 0)
			s += 1LL * (a[i][1].first - a[i][0].first) * (a[i][1].second - a[i][0].second);
	for (i = 0; i < k - 1; ++i)
		if (it[i][1].first - it[i][0].first > 0 && it[i][1].second - it[i][0].second > 0)
			s -= 1LL * (it[i][1].first - it[i][0].first ) * (it[i][1].second - it[i][0].second );
	//j  =  1LL * minim(minim(it[0][1].first, it[1][1].first), minim(it[0][1].first, it[2][1].first)) - maxim(maxim(it[0][0].first, it[1][0].first), maxim(it[0][0].first, it[2][0].first));
    if (j > 0)
		j *= 1LL * minim(minim(it[0][1].second, it[1][1].second), minim(it[0][1].second, it[2][1].second)) - maxim(maxim(it[0][0].second, it[1][0].second), maxim(it[0][0].second, it[2][0].second));
	if (j > 0)
		s += j;
}

void solve()
{
	int i,j;
	for (i = 0; i < 3; ++i)
		for (j = i + 1; j <3; ++j)
		{
			it[k][0] = make_pair( maxim(a[i][0].first, a[j][0].first), maxim(a[i][0].second, a[j][0].second));
			it[k++][1] = make_pair( minim(a[i][1].first, a[j][1].first), minim(a[i][1].second, a[j][1].second));
		}
    for (i = 1; i < k - 1; ++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];
    }
	/*p = 2 * (maxim(maxim(a[0][1].second, a[1][1].second), maxim(a[0][1].second, a[2][1].second))
		     - minim(minim(a[0][0].second, a[1][0].second), minim(a[0][0].second, a[2][0].second)))
		+ 2 * (maxim(maxim(a[0][1].first, a[1][1].first), maxim(a[0][1].first, a[2][1].first))
		     - minim(minim(a[0][0].first, a[1][0].first), minim(a[0][0].first, a[2][0].first)));
    */
    perimetru();

    arie();

}
void write()
{
	freopen(FOUT,"w",stdout);
	cout << s << " " << p << "\n";
}
int main()
{
	read();
	solve();
	write();
}