Cod sursa(job #266450)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 25 februarie 2009 16:38:49
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.38 kb
#include <cstdio>
#include <algorithm>
#include <iostream>
#define FIN "reuniune.in"
#define FOUT "reuniune.out"
#define INF 2000000000LL
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);
}
long long maxim(long long a, long long b)
{
	return a > b ? a : b;
}
long long minim(long long a,long long b)
{
	return a < b ? a : b;
}

void perimetru()
{
    int i;
    for (i = 0; i< 3; ++i)
        p += 2LL * ((long long)(a[i][1].first - a[i][0].first) + (a[i][1].second - a[i][0].second));
    for (i = 0; i < k; ++i)
    {
        if (it[i][1].first >= it[i][0].first && it[i][1].second >= it[i][0].second)
            p -= 2LL * ((long long) 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 * ((long long) it[k][1].first - it[k][0].first + it[k][1].second - it[k][0].second);

}

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

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));
		}
	it[k][0] = make_pair(- INF, - INF);
	it[k][1] = make_pair(INF,INF);
    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];
    }
	/*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();
}