#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define LD long double
#define SC(t,x) static_cast<t>(x)
#define AR(t) vector < t >
#define PII pair < int, int >
#define PLL pair < LL, LL >
#define PIL pair < int, LL >
#define PLI pair < LL, int >
#define MP make_pair
#define PB push_back
#define PF push_front
#define POB pop_back
#define POF pop_front
#define PRF first
#define PRS second
#define INIT(ar,val) memset ( ar, val, sizeof ( ar ) )
#define lp(loop,start,end) for ( int loop = start; loop < end; ++loop )
#define lpd(loop,start,end) for ( int loop = start; loop > end; --loop )
#define lpi(loop,start,end) for ( int loop = start; loop <= end; ++loop )
#define lpdi(loop,start,end) for ( int loop = start; loop >= end; --loop )
#define qmax(a,b) (((a)>(b))?(a):(b))
#define qmin(a,b) (((a)<(b))?(a):(b))
#define qabs(a) (((a)>=0)?(a):(-(a)))

const int INF = 0x3fffffff;
const int SINF = 0x7fffffff;
const long long LINF = 0x3fffffffffffffff;
const long long SLINF = 0x7fffffffffffffff;
const int MAXN = 200007;
const LD PI = acos ( -1.0 );
const int MAX = SC ( int, 1e8 );

class ftT
{
public:
	void upd ( int p, int x )
	{
		for ( ; p < MAXN; p += p&-p ) data[p] = qmax ( data[p], x );
	}
	
	int query ( int p )
	{
		int ans = 0;
		for ( ; p; p ^= p&-p ) ans = qmax ( ans, data[p] );
		return ans;
	}
	
private:
	int data[MAXN];
}ft;

struct cT
{
	bool operator < ( const cT &a ) const
	{
		return x < a.x;
	}
	
	int x, y;
}cr[MAXN];

int n, sx, sy, tx, ty;
int dp[MAXN];

void init ();
void input ();
void work ();



int main()
{
	init();
	input();
	work();
}



void init ()
{
	// Init Everything Here
	
	ios::sync_with_stdio ( false );
}

void input ()
{
	// input method
	
	scanf ( "%d%d%d%d", &sx, &sy, &tx, &ty );
	scanf ( "%d", &n );
	lpi ( i, 1, n ) scanf ( "%d%d", &cr[i].x, &cr[i].y );
}

void work ()
{
	if ( sx == tx || sy == ty ){
		if ( sx > tx ) swap ( sx, tx );
		if ( sy > ty ) swap ( sy, ty );
		int cc = 0;
		lpi ( i, 1, n ) if ( cr[i].x >= sx && cr[i].x <= tx && cr[i].y >= sy && cr[i].y <= ty ) ++cc;
		cout << setprecision ( 13 ) << fixed << SC ( LL, tx - sx + ty - sy ) * 100 + ( PI - 2 ) * 10 * cc << endl;
		return;
	}
	
	if ( ( sx < tx ) ^ ( sy < ty ) ){
		sy = MAX - sy;
		ty = MAX - ty;
		lpi ( i, 1, n ) cr[i].y = MAX - cr[i].y;
	}
	if ( sx > tx ){
		swap ( sx, tx );
		swap ( sy, ty );
	}
	
	int tn = 0;
	lpi ( i, 1, n ){
		if ( cr[i].x >= sx && cr[i].x <= tx && cr[i].y >= sy && cr[i].y <= ty ){
			cr[++tn] = cr[i];
		}
	}
	
	n = tn;
	map < int, int > mx, my;
	lpi ( i, 1, n ) mx[cr[i].x] = 0, my[cr[i].y] = 0;
	int kx = 0;
	for ( auto &x : mx ) x.second = ++kx;
	int ky = 0;
	for ( auto &x : my ) x.second = ++ky;
	lpi ( i, 1, n ) cr[i].x = mx[cr[i].x], cr[i].y = my[cr[i].y];
	
	sort ( cr+1, cr+1+n );
	lpi ( i, 1, n ){
		dp[i] = ft.query ( cr[i].y ) + 1;
		ft.upd ( cr[i].y, dp[i] );
	}
	
	if ( ft.query ( n ) == qmin ( tx - sx + 1, ty - sy + 1 ) ){
		cout << setprecision ( 13 ) << fixed << SC ( LL, tx - sx + ty - sy ) * 100 - ( 2 - PI / 2 ) * 10 * ( ft.query ( n ) - 1 ) + ( PI - 2 ) * 10 << endl;
		return;
	}
	
//	cerr << sx << " " << tx << " " << sy << " " << ty << " " << ft.query ( n ) << endl;
	cout << setprecision ( 13 ) << fixed << SC ( LL, tx - sx + ty - sy ) * 100 - ( 2 - PI / 2 ) * 10 * ft.query ( n ) << endl;
}

Measured memory_bytes: 22656