Cod sursa(job #637503)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 20 noiembrie 2011 14:52:44
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 7.16 kb
#include <cstdio>
#include <algorithm>
#include <cmath>

#define ll long long
#define PIII pair< pair< ll, ll >, ll >
#define x first.first
#define y first.second
#define cost second
#define INF (1<<60)

using namespace std;

ll N, M, T, Min;
PIII P1, P2, P3, P4, P5, P6;

inline ll MIN( ll X, ll Y )
{ return ( X < Y ) ? X : Y; }

inline ll Dist0( ll H, ll L )
{ return L + H; }

inline ll Dist1( PIII p1, PIII p2, ll Cost )
{ return Cost + p1.x + p1.y + abs( N - p2.x ) + abs( M - p2.y ); }

inline ll Dist2( PIII p1, PIII p2, PIII p3, PIII p4, ll Cost )
{ return Cost + p1.x + p1.y + abs( p2.x - p3.x ) + abs( p2.y - p3.y ) + abs( N - p4.x ) + abs( M - p4.y ); }

inline ll Dist3( PIII p1, PIII p2, PIII p3, PIII p4, PIII p5, PIII p6, ll Cost )
{ return Cost + p1.x + p1.y + abs( p2.x - p3.x ) + abs( p2.y - p3.y ) + abs( p4.x - p5.x ) + abs( p4.y - p5.y ) + abs( p6.x - N ) + abs( p6.y - M ); }

inline void Rezolva()
{
	Min = Dist0( N, M ); // 0 perechi
	
	Min = MIN( Min, Dist1( P1, P2, P1.cost ) ); // 1 pereche
	Min = MIN( Min, Dist1( P2, P1, P1.cost ) );
	Min = MIN( Min, Dist1( P3, P4, P3.cost ) );
	Min = MIN( Min, Dist1( P4, P3, P3.cost ) );
	Min = MIN( Min, Dist1( P5, P6, P5.cost ) );
	Min = MIN( Min, Dist1( P6, P5, P5.cost ) );
	
	Min = MIN( Min, Dist2( P1, P2, P3, P4, P1.cost + P3.cost ) ); // 2 perechi
	Min = MIN( Min, Dist2( P2, P1, P3, P4, P1.cost + P3.cost ) );
	Min = MIN( Min, Dist2( P1, P2, P4, P3, P1.cost + P3.cost ) );
	Min = MIN( Min, Dist2( P2, P1, P4, P3, P1.cost + P3.cost ) );
	Min = MIN( Min, Dist2( P3, P4, P1, P2, P1.cost + P3.cost ) );
	Min = MIN( Min, Dist2( P3, P4, P2, P1, P1.cost + P3.cost ) );
	Min = MIN( Min, Dist2( P4, P3, P1, P2, P1.cost + P3.cost ) );
	Min = MIN( Min, Dist2( P4, P3, P2, P1, P1.cost + P3.cost ) );
	
	Min = MIN( Min, Dist2( P1, P2, P5, P6, P1.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P2, P1, P5, P6, P1.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P1, P2, P6, P5, P1.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P2, P1, P6, P5, P1.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P5, P6, P1, P2, P1.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P5, P6, P2, P1, P1.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P6, P5, P1, P2, P1.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P6, P5, P2, P1, P1.cost + P5.cost ) );
	
	Min = MIN( Min, Dist2( P3, P4, P5, P6, P3.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P4, P3, P5, P6, P3.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P3, P4, P6, P5, P3.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P4, P3, P6, P5, P3.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P5, P6, P3, P4, P3.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P5, P6, P4, P3, P3.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P6, P5, P3, P4, P3.cost + P5.cost ) );
	Min = MIN( Min, Dist2( P6, P5, P4, P3, P3.cost + P5.cost ) );
	
	Min = MIN( Min, Dist3( P1, P2, P3, P4, P5, P6, P1.cost + P3.cost + P5.cost ) ); // 3 perechi
	Min = MIN( Min, Dist3( P1, P2, P3, P4, P6, P5, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P1, P2, P4, P3, P5, P6, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P1, P2, P4, P3, P6, P5, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P3, P4, P5, P6, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P3, P4, P6, P5, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P4, P3, P5, P6, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P4, P3, P6, P5, P1.cost + P3.cost + P5.cost ) );
	
	Min = MIN( Min, Dist3( P3, P4, P1, P2, P5, P6, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P3, P4, P1, P2, P6, P5, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P1, P2, P5, P6, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P1, P2, P6, P5, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P3, P4, P2, P1, P5, P6, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P3, P4, P2, P1, P6, P5, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P2, P1, P5, P6, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P2, P1, P6, P5, P1.cost + P3.cost + P5.cost ) );
	
	Min = MIN( Min, Dist3( P1, P2, P5, P6, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P1, P2, P6, P5, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P1, P2, P5, P6, P4, P3, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P1, P2, P6, P5, P4, P3, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P5, P6, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P6, P5, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P5, P6, P4, P3, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P2, P1, P6, P5, P4, P3, P1.cost + P3.cost + P5.cost ) );
	
	Min = MIN( Min, Dist3( P3, P4, P5, P6, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P3, P4, P6, P5, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P5, P6, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P6, P5, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P3, P4, P5, P6, P2, P1, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P3, P4, P6, P5, P2, P1, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P5, P6, P2, P1, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P4, P3, P6, P5, P2, P1, P1.cost + P3.cost + P5.cost ) );
	
	Min = MIN( Min, Dist3( P5, P6, P1, P2, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P1, P2, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P5, P6, P1, P2, P4, P3, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P1, P2, P4, P3, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P5, P6, P2, P1, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P2, P1, P3, P4, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P5, P6, P2, P1, P4, P3, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P2, P1, P4, P3, P1.cost + P3.cost + P5.cost ) );
	
	Min = MIN( Min, Dist3( P5, P6, P3, P4, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P3, P4, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P5, P6, P4, P3, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P4, P3, P1, P2, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P5, P6, P3, P4, P2, P1, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P3, P4, P2, P1, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P5, P6, P4, P3, P2, P1, P1.cost + P3.cost + P5.cost ) );
	Min = MIN( Min, Dist3( P6, P5, P4, P3, P2, P1, P1.cost + P3.cost + P5.cost ) );
	
	printf("%lld\n", Min);
}

int main()
{
	freopen("portal3.in", "r", stdin);
	freopen("portal3.out", "w", stdout);
	
	scanf("%lld", &T);
	for( ; T; --T )
	{
		scanf("%lld%lld", &N, &M);
		scanf("%lld %lld %lld %lld %lld", &P1.x, &P1.y, &P2.x, &P2.y, &P1.cost);
		P2.cost = P1.cost;
		scanf("%lld%lld%lld%lld%lld", &P3.x, &P3.y, &P4.x, &P4.y, &P3.cost);
		P4.cost = P3.cost;
		scanf("%lld%lld%lld%lld%lld", &P5.x, &P5.y, &P6.x, &P6.y, &P5.cost);
		P6.cost = P5.cost;
		
		Rezolva();
	}
	
	return 0;
}