Submission #84614


Source Code Expand

#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cfloat>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <numeric>
#include <iterator>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int,int> PII;
typedef vector<PII> VPII;
typedef istringstream ISS;
typedef ostringstream OSS;

#define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i )
#define FOR( v, c ) for ( auto &v : c )
#define EACH( it, c ) for ( auto it = c.begin(); it != c.end(); ++it )
#define ALL( c ) (c).begin(), (c).end()
#define DRANGE( c, p ) (c).begin(), (c).begin() + p, (c).end()

#define PB( n ) push_back( n )
#define MP( a, b ) make_pair( ( a ), ( b ) )
#define EXIST( c, e ) ( (c).find( e ) != (c).end() )

#define fst first
#define snd second

#define DUMP( x ) cerr << #x << " = " << ( x ) << endl
#define DEBUG( x ) cerr << __FILE__ << ":" << __LINE__ << ": " << #x << " = " << ( x ) << endl

#include <complex>
typedef complex<double> Point;
const double EPS = 1e-8;

// 入力ストリームから実数二つをとって Point へ
istream& operator >> ( istream &s, Point &a )
{
	double r, i;
	s >> r >> i;
	a = Point( r, i );
	return s;
}

// a == b
bool eq( const double a, const double b )
{
	return abs( a - b ) <= EPS;
}

// x 座標優先
// include : eq
struct CompX : public binary_function<Point,Point,bool>
{
	bool operator ()( const Point &a, const Point &b ) const
	{
		return eq( a.real(), b.real() ) ? a.imag() < b.imag() : a.real() < b.real();
	}
};

// 外積(クロス積)
double cross( const Point &a, const Point &b )
{
	return a.real() * b.imag() - a.imag() * b.real();
}

// 点 p と直線 ( q1, q2 ) の距離
// include : cross
double distancePL( const Point &p, const Point &q1, const Point &q2 )
{
	return abs( cross( q2 - q1, p - q1 ) ) / abs( ( q2 - q1 ) );
}

// 最小費用流 O( F |E| log |V| )
class MinimumCostFlow
{
private:
	struct Edge
	{
		int to, cap, rev;
		double cost;
		Edge( int t, int c, double d, int r ) : to( t ), cap( c ), cost( d ), rev( r ) {}
	};

	const int V;
	vector< vector<Edge> > G;

public:
	MinimumCostFlow( int v ) : V( v ), G( V ) {};

	void connect( int from, int to, int cap, double cost )
	{
		G[ from ].PB( Edge( to, cap, cost, G[ to ].size() ) );
		G[ to ].PB( Edge( from, 0, -cost, G[ from ].size() - 1 ) );
		return;
	}

	double solve( int s, int t, int f )
	{
		double res = 0;
		vector<double> h( V, 0 );
		vector<int> prevv( V ), preve( V );

		while ( 0 < f )
		{
			vector<double> distance( V, DBL_MAX / 4 );
			distance[s] = 0;

			priority_queue< pair<double,int>, vector< pair<double,int> >, greater< pair<double,int> > > que;
			que.push( make_pair( 0, s ) );
			
			while ( !que.empty() )
			{
				double d = que.top().first;
				int v = que.top().second;
				que.pop();

				if ( distance[v] < d )
				{
					continue;
				}

				for ( int i = 0; i < G[v].size(); ++i )
				{
					Edge &e = G[v][i];
					if ( 0 < e.cap && distance[v] + e.cost + h[v] - h[ e.to ] < distance[ e.to ] )
					{
						distance[ e.to ] = distance[v] + e.cost + h[v] - h[ e.to ];
						prevv[ e.to ] = v;
						preve[ e.to ] = i;
						que.push( make_pair( distance[ e.to ], e.to ) );
					}
				}
			}

			if ( distance[t] == DBL_MAX / 4 )
			{
				return -1;
			}

			for ( int i = 0; i < V; ++i )
			{
				h[i] += distance[i];
			}

			int d = f;
			for ( int v = t; v != s; v = prevv[v] )
			{
				d = min( d, G[ prevv[v] ][ preve[v] ].cap );
			}
			f -= d;
			res += d * h[t];
			for ( int v = t; v != s; v = prevv[v] )
			{
				Edge &e = G[ prevv[v] ][ preve[v] ];
				e.cap -= d;
				G[v][ e.rev ].cap += d;
			}
		}

		return res;
	}
};
// MinimumCostFlow( |V| )
// connect( from, to, cap, cost )
// solve( s, t, f )

int main()
{
	cin.tie( 0 );
	ios::sync_with_stdio( false );

	int n;
	cin >> n;

	vector<Point> ps( n );
	FOR( p, ps )
	{
		cin >> p;
	}

	vector<Point> qs;
	transform( ALL( ps ), back_inserter( qs ), []( Point p ){ return Point( p.real() * -1, p.imag() ); } );

	MinimumCostFlow mcf( n * 2 + 2 );
	
	REP( i, 0, n )
	{
		REP( j, 0, n )
		{
			mcf.connect( i, n + j, 1, abs( ps[i] - qs[j] ) );
		}
	}
	REP( i, 0, n )
	{
		mcf.connect( n * 2, i, 1, 0 );
		mcf.connect( n + i, n * 2 + 1, 1, 0 );
	}

	cout << setprecision( 10 ) << fixed;
	cout << mcf.solve( n * 2, n * 2 + 1, n ) / 2 << endl;

	return 0;
}

Submission Info

Submission Time
Task B - 玉座の間
User torus711
Language C++11 (GCC 4.8.1)
Score 200
Code Size 4858 Byte
Status AC
Exec Time 42 ms
Memory 1428 KB

Judge Result

Set Name Subtask1 Subtask2 Subtask3 Subtask4
Score / Max Score 50 / 50 50 / 50 50 / 50 50 / 50
Status
AC × 25
AC × 50
AC × 75
AC × 100
Set Name Test Cases
Subtask1 11_rand00.txt, 11_rand01.txt, 11_rand02.txt, 11_rand03.txt, 11_rand04.txt, 11_rand05.txt, 11_rand06.txt, 11_rand07.txt, 11_rand08.txt, 11_rand09.txt, 11_rand10.txt, 11_rand11.txt, 11_rand12.txt, 11_rand13.txt, 11_rand14.txt, 11_rand15.txt, 11_rand16.txt, 11_rand17.txt, 11_rand18.txt, 11_rand19.txt, 11_rand20.txt, 11_rand21.txt, 11_rand22.txt, 11_rand23.txt, 11_rand24.txt
Subtask2 11_rand00.txt, 11_rand01.txt, 11_rand02.txt, 11_rand03.txt, 11_rand04.txt, 11_rand05.txt, 11_rand06.txt, 11_rand07.txt, 11_rand08.txt, 11_rand09.txt, 11_rand10.txt, 11_rand11.txt, 11_rand12.txt, 11_rand13.txt, 11_rand14.txt, 11_rand15.txt, 11_rand16.txt, 11_rand17.txt, 11_rand18.txt, 11_rand19.txt, 11_rand20.txt, 11_rand21.txt, 11_rand22.txt, 11_rand23.txt, 11_rand24.txt, 21_rand00.txt, 21_rand01.txt, 21_rand02.txt, 21_rand03.txt, 21_rand04.txt, 21_rand05.txt, 21_rand06.txt, 21_rand07.txt, 21_rand08.txt, 21_rand09.txt, 21_rand10.txt, 21_rand11.txt, 21_rand12.txt, 21_rand13.txt, 21_rand14.txt, 21_rand15.txt, 21_rand16.txt, 21_rand17.txt, 21_rand18.txt, 21_rand19.txt, 21_rand20.txt, 21_rand21.txt, 21_rand22.txt, 21_rand23.txt, 21_rand24.txt
Subtask3 11_rand00.txt, 11_rand01.txt, 11_rand02.txt, 11_rand03.txt, 11_rand04.txt, 11_rand05.txt, 11_rand06.txt, 11_rand07.txt, 11_rand08.txt, 11_rand09.txt, 11_rand10.txt, 11_rand11.txt, 11_rand12.txt, 11_rand13.txt, 11_rand14.txt, 11_rand15.txt, 11_rand16.txt, 11_rand17.txt, 11_rand18.txt, 11_rand19.txt, 11_rand20.txt, 11_rand21.txt, 11_rand22.txt, 11_rand23.txt, 11_rand24.txt, 21_rand00.txt, 21_rand01.txt, 21_rand02.txt, 21_rand03.txt, 21_rand04.txt, 21_rand05.txt, 21_rand06.txt, 21_rand07.txt, 21_rand08.txt, 21_rand09.txt, 21_rand10.txt, 21_rand11.txt, 21_rand12.txt, 21_rand13.txt, 21_rand14.txt, 21_rand15.txt, 21_rand16.txt, 21_rand17.txt, 21_rand18.txt, 21_rand19.txt, 21_rand20.txt, 21_rand21.txt, 21_rand22.txt, 21_rand23.txt, 21_rand24.txt, 31_rand00.txt, 31_rand01.txt, 31_rand02.txt, 31_rand03.txt, 31_rand04.txt, 31_rand05.txt, 31_rand06.txt, 31_rand07.txt, 31_rand08.txt, 31_rand09.txt, 31_rand10.txt, 31_rand11.txt, 31_rand12.txt, 31_rand13.txt, 31_rand14.txt, 31_rand15.txt, 31_rand16.txt, 31_rand17.txt, 31_rand18.txt, 31_rand19.txt, 31_rand20.txt, 31_rand21.txt, 31_rand22.txt, 31_rand23.txt, 31_rand24.txt
Subtask4 11_rand00.txt, 11_rand01.txt, 11_rand02.txt, 11_rand03.txt, 11_rand04.txt, 11_rand05.txt, 11_rand06.txt, 11_rand07.txt, 11_rand08.txt, 11_rand09.txt, 11_rand10.txt, 11_rand11.txt, 11_rand12.txt, 11_rand13.txt, 11_rand14.txt, 11_rand15.txt, 11_rand16.txt, 11_rand17.txt, 11_rand18.txt, 11_rand19.txt, 11_rand20.txt, 11_rand21.txt, 11_rand22.txt, 11_rand23.txt, 11_rand24.txt, 21_rand00.txt, 21_rand01.txt, 21_rand02.txt, 21_rand03.txt, 21_rand04.txt, 21_rand05.txt, 21_rand06.txt, 21_rand07.txt, 21_rand08.txt, 21_rand09.txt, 21_rand10.txt, 21_rand11.txt, 21_rand12.txt, 21_rand13.txt, 21_rand14.txt, 21_rand15.txt, 21_rand16.txt, 21_rand17.txt, 21_rand18.txt, 21_rand19.txt, 21_rand20.txt, 21_rand21.txt, 21_rand22.txt, 21_rand23.txt, 21_rand24.txt, 31_rand00.txt, 31_rand01.txt, 31_rand02.txt, 31_rand03.txt, 31_rand04.txt, 31_rand05.txt, 31_rand06.txt, 31_rand07.txt, 31_rand08.txt, 31_rand09.txt, 31_rand10.txt, 31_rand11.txt, 31_rand12.txt, 31_rand13.txt, 31_rand14.txt, 31_rand15.txt, 31_rand16.txt, 31_rand17.txt, 31_rand18.txt, 31_rand19.txt, 31_rand20.txt, 31_rand21.txt, 31_rand22.txt, 31_rand23.txt, 31_rand24.txt, 41_rand00.txt, 41_rand01.txt, 41_rand02.txt, 41_rand03.txt, 41_rand04.txt, 41_rand05.txt, 41_rand06.txt, 41_rand07.txt, 41_rand08.txt, 41_rand09.txt, 41_rand10.txt, 41_rand11.txt, 41_rand12.txt, 41_rand13.txt, 41_rand14.txt, 41_rand15.txt, 41_rand16.txt, 41_rand17.txt, 41_rand18.txt, 41_rand19.txt, 41_rand20.txt, 41_rand21.txt, 41_rand22.txt, 41_rand23.txt, 41_rand24.txt
Case Name Status Exec Time Memory
11_rand00.txt AC 21 ms 792 KB
11_rand01.txt AC 21 ms 788 KB
11_rand02.txt AC 20 ms 796 KB
11_rand03.txt AC 20 ms 796 KB
11_rand04.txt AC 19 ms 788 KB
11_rand05.txt AC 20 ms 784 KB
11_rand06.txt AC 23 ms 788 KB
11_rand07.txt AC 20 ms 800 KB
11_rand08.txt AC 20 ms 788 KB
11_rand09.txt AC 19 ms 784 KB
11_rand10.txt AC 19 ms 792 KB
11_rand11.txt AC 22 ms 688 KB
11_rand12.txt AC 20 ms 796 KB
11_rand13.txt AC 20 ms 796 KB
11_rand14.txt AC 20 ms 660 KB
11_rand15.txt AC 20 ms 792 KB
11_rand16.txt AC 20 ms 780 KB
11_rand17.txt AC 20 ms 796 KB
11_rand18.txt AC 19 ms 788 KB
11_rand19.txt AC 20 ms 796 KB
11_rand20.txt AC 20 ms 784 KB
11_rand21.txt AC 20 ms 772 KB
11_rand22.txt AC 20 ms 788 KB
11_rand23.txt AC 20 ms 696 KB
11_rand24.txt AC 20 ms 788 KB
21_rand00.txt AC 20 ms 672 KB
21_rand01.txt AC 20 ms 796 KB
21_rand02.txt AC 20 ms 788 KB
21_rand03.txt AC 20 ms 788 KB
21_rand04.txt AC 20 ms 788 KB
21_rand05.txt AC 20 ms 680 KB
21_rand06.txt AC 20 ms 788 KB
21_rand07.txt AC 20 ms 788 KB
21_rand08.txt AC 20 ms 792 KB
21_rand09.txt AC 21 ms 780 KB
21_rand10.txt AC 19 ms 788 KB
21_rand11.txt AC 18 ms 664 KB
21_rand12.txt AC 20 ms 792 KB
21_rand13.txt AC 19 ms 784 KB
21_rand14.txt AC 20 ms 788 KB
21_rand15.txt AC 18 ms 788 KB
21_rand16.txt AC 20 ms 768 KB
21_rand17.txt AC 20 ms 784 KB
21_rand18.txt AC 20 ms 792 KB
21_rand19.txt AC 20 ms 780 KB
21_rand20.txt AC 20 ms 788 KB
21_rand21.txt AC 20 ms 796 KB
21_rand22.txt AC 20 ms 796 KB
21_rand23.txt AC 20 ms 788 KB
21_rand24.txt AC 19 ms 788 KB
31_rand00.txt AC 20 ms 692 KB
31_rand01.txt AC 21 ms 792 KB
31_rand02.txt AC 21 ms 788 KB
31_rand03.txt AC 20 ms 788 KB
31_rand04.txt AC 21 ms 792 KB
31_rand05.txt AC 20 ms 788 KB
31_rand06.txt AC 21 ms 676 KB
31_rand07.txt AC 19 ms 792 KB
31_rand08.txt AC 21 ms 796 KB
31_rand09.txt AC 21 ms 688 KB
31_rand10.txt AC 21 ms 780 KB
31_rand11.txt AC 21 ms 796 KB
31_rand12.txt AC 21 ms 792 KB
31_rand13.txt AC 21 ms 788 KB
31_rand14.txt AC 23 ms 664 KB
31_rand15.txt AC 20 ms 792 KB
31_rand16.txt AC 21 ms 780 KB
31_rand17.txt AC 20 ms 784 KB
31_rand18.txt AC 22 ms 796 KB
31_rand19.txt AC 21 ms 708 KB
31_rand20.txt AC 20 ms 788 KB
31_rand21.txt AC 21 ms 672 KB
31_rand22.txt AC 21 ms 668 KB
31_rand23.txt AC 21 ms 792 KB
31_rand24.txt AC 21 ms 796 KB
41_rand00.txt AC 20 ms 792 KB
41_rand01.txt AC 19 ms 788 KB
41_rand02.txt AC 23 ms 916 KB
41_rand03.txt AC 25 ms 940 KB
41_rand04.txt AC 28 ms 1168 KB
41_rand05.txt AC 23 ms 916 KB
41_rand06.txt AC 23 ms 900 KB
41_rand07.txt AC 34 ms 1332 KB
41_rand08.txt AC 20 ms 680 KB
41_rand09.txt AC 22 ms 820 KB
41_rand10.txt AC 19 ms 780 KB
41_rand11.txt AC 28 ms 1176 KB
41_rand12.txt AC 32 ms 1304 KB
41_rand13.txt AC 22 ms 696 KB
41_rand14.txt AC 25 ms 920 KB
41_rand15.txt AC 21 ms 792 KB
41_rand16.txt AC 20 ms 704 KB
41_rand17.txt AC 25 ms 1040 KB
41_rand18.txt AC 42 ms 1428 KB
41_rand19.txt AC 41 ms 1428 KB
41_rand20.txt AC 23 ms 816 KB
41_rand21.txt AC 20 ms 780 KB
41_rand22.txt AC 21 ms 916 KB
41_rand23.txt AC 36 ms 1300 KB
41_rand24.txt AC 28 ms 1168 KB