// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



#define FOR(i,a,b) for(int i = (a); i < (b); i++)

#define RFOR(i,b,a) for(int i = (b) - 1; i >= (a); i--)

#define ITER(it, a) for(typeof(a.begin()) it = a.begin(); it != a.end(); it++)

#define FILL(a, value) memset(a, value, sizeof(a))



#define SZ(a) (int) a.size()

#define ALL(a) a.begin(),a.end()

#define PB push_back

#define MP make_pair



typedef long long LL;

typedef vector<int> VI;

typedef pair<int, int> PII;



const double PI = acos(-1.0);

const LL INF = 1000 * 1000 * 1000 + 7;

const LL LINF = INF * (LL)INF;



const int MAX = 400400;



PII A[MAX];



VI v;

int get(int x)

{

	return lower_bound(ALL(v), x) - v.begin();

}



struct Fen

{

	int A[MAX];

	int n;



	void init(int n)

	{

		this->n = n;

		FOR (i, 0, n)

		{

			A[i] = -INF;

		}

	}



	void add(int x, int val)

	{

		for (; x < n; x = x | (x+1))

		{

			A[x] = max(A[x], val);

		}

	}



	int get(int x)

	{

		int res = -INF;

		for (; x >= 0; x = (x & (x + 1)) - 1)

		{

			res = max(res, A[x]);

		}

		return res;

	}

} F;



int main()

{

	//freopen("in.txt", "r", stdin);

	//ios::sync_with_stdio(false); cin.tie(0);



	int x1, y1, x2, y2;

	scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

	int n;

	scanf("%d", &n);



	FOR (i, 0, n)

	{

		int x, y;

		scanf("%d%d", &x, &y);

		A[i] = MP(x, y);

	}



	if (x2 > x1)

	{

		FOR (i, 0, n)

		{

			A[i].first *= -1;

		}

		x1 *= -1;

		x2 *= -1;

	}



	if (y2 > y1)

	{

		FOR (i, 0, n)

		{

			A[i].second *= -1;

		}

		y1 *= -1;

		y2 *= -1;

	}



	int dx = abs(x1 - x2);

	int dy = abs(y1 - y2);



	double res = (dx + dy) * 100.;



	v.PB(x1);

	v.PB(y1);

	v.PB(x2);

	v.PB(y2);

	FOR (i, 0, n)

	{

		v.PB(A[i].first);

		v.PB(A[i].second);

	}



	sort(ALL(v));

	v.erase(unique(ALL(v)), v.end());



	x1 = get(x1);

	y1 = get(y1);

	x2 = get(x2);

	y2 = get(y2);

	FOR (i, 0, n)

	{

		A[i].first = get(A[i].first);

		A[i].second = get(A[i].second);

	}



	sort(A, A+n);



	F.init(SZ(v));



	F.add(y2, 0);



	FOR (i, 0, n)

	{

		if (A[i].first < x2) continue;

		if (A[i].first > x1) break;

		int v = F.get(A[i].second) + 1;

		F.add(A[i].second, v);

	}



	int cnt = F.get(y1);



	int a, b;



	//double sub = (20 - PI * 10 / 2) * cnt;

	//res -= sub;

	a = cnt;

	b = 0;



	if (cnt == min(dx, dy) + 1)

	{

		a--;

		b++;

	}



	res -= a * (20 - PI * 5);

	res += b * (PI*10 - 20);



	printf("%.15f\n", res);



}


// Faster C++ solution for the same problem (measured speedup: 5.064459816539383x):
#include<cstdio>

#include<algorithm>

using namespace std;

#define MAXN 200010

#define PI 3.1415926535897932384626433832795

struct node

{

	int x,y;

	bool operator < (const node &a)

	{

		return x<a.x;

	}

}e[MAXN];

int sx,sy,ex,ey,n;

void Pre()

{

	bool f=0;

	if(sy>ey) swap(sx,ex),swap(sy,ey);

	if(sy==ey&&sx>ex) swap(sx,ex);

	if(sx>ex) f=1,ex=2*sx-ex;

	ex-=sx,ey-=sy;

	int x,y,m=0;

	for(int i=1;i<=n;i++)

	{

		scanf("%d%d",&x,&y);

		if(f) x=2*sx-x;

		x-=sx,y-=sy;

		if(x<0||x>ex||y<0||y>ey) continue;

		e[++m].x=x,e[m].y=y;

	}

	sx=0,sy=0;

	n=m;

}

int a[MAXN],st[MAXN],r;

void Solve()

{

	for(int i=1;i<=n;i++)

		a[i]=e[i].y;

	st[0]=-1;

	for(int i=1;i<=n;i++)

	{

		if(a[i]>st[r]) st[++r]=a[i];

		else

		{

			int p=upper_bound(st,st+r+1,a[i])-st;

			st[p]=a[i];

		}

	}

}

int main()

{

	scanf("%d%d%d%d%d",&sx,&sy,&ex,&ey,&n);

	Pre();

	sort(e+1,e+1+n);

	Solve();

	int t=min(ex,ey)+1;

	double ans=100LL*(ex+ey);

	if(r==t) ans+=(r-1)*5LL*PI+10LL*PI-20LL*r;

	else ans+=r*5LL*PI-20LL*r;

	printf("%.12lf\n",ans);

}