#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
#define ll long long
typedef pair<ll,ll> pi;
ll xone, yone, xtwo, ytwo;
ll N, x, y;
pi arr[200005];
vector<pi> vx, vy;
long double pii = 3.1415926535897932384626433;

vector<ll> h;
ll l = 0;

int main(){
	scanf("%lld%lld%lld%lld", &xone, &yone, &xtwo, &ytwo);
	scanf("%lld", &N);
	for (int i = 0; i < N; i++){
		scanf("%lld%lld", &x, &y);
		arr[i] = make_pair(x, y);
	}
	
	if (xone == xtwo && yone == ytwo){ //start and end point the same
		printf("0.00000000000000000000\n");
		return 0;
	}
	
	//flip all points
	if (xone <= xtwo && yone <= ytwo){
		//ok configuration
	} else if (xone > xtwo && yone <= ytwo){
		xtwo = 2*xone - xtwo;
		for (int i = 0; i < N; i++){
			arr[i].first = 2*xone - arr[i].first;
		}
	} else if (xone <= xtwo && yone > ytwo){
		ytwo = 2*yone - ytwo;
		for (int i = 0; i < N; i++){
			arr[i].second = 2*yone - arr[i].second;
		}
	} else {
		xtwo = 2*xone - xtwo;
		for (int i = 0; i < N; i++){
			arr[i].first = 2*xone - arr[i].first;
		}
		ytwo = 2*yone - ytwo;
		for (int i = 0; i < N; i++){
			arr[i].second = 2*yone - arr[i].second;
		}
	}
	
	if (xone == xtwo){ //y-axis
		//something
		for (int i = 0; i < N; i++){
			if (arr[i].first == xone && arr[i].second > yone && arr[i].second < ytwo){
				printf("%.20Lf\n", (long double)((long double)100)*(ytwo - yone) + pii*((long double)10.0) - (long double)20.0);
				return 0;
			}
		}
		printf("%.20Lf\n", (long double)((long double)100)*(ytwo - yone));
		return 0;
	}
	if (yone == ytwo){ //x-axis
		//something
		for (int i = 0; i < N; i++){
			if (arr[i].second == yone && arr[i].first > xone && arr[i].first < xtwo){
				printf("%.20Lf\n", (long double)((long double)100)*(xtwo - xone) + pii*((long double)10.0) - (long double)20.0);
				return 0;
			}
		}
		printf("%.20Lf\n", (long double)((long double)100)*(xtwo - xone));
		return 0;
	}
	
	//get good fountains
	for (int i = 0; i < N; i++){
		if (arr[i].first < xone || arr[i].first > xtwo) continue;
		if (arr[i].second < yone || arr[i].second > ytwo) continue;
		vx.push_back(arr[i]);
		vy.push_back(make_pair(arr[i].second, arr[i].first));
	}
	sort(vx.begin(), vx.end()); //sort by x, y is the lis
	sort(vy.begin(), vy.end()); //sort by y, x is the lis
	//run lis
	h.clear();
	for (int i = 0; i < (int)vx.size(); i++) {
		if(h.size()==0||h.back()<vx[i].second)h.push_back(vx[i].second);
		else{
			ll p = lower_bound(h.begin(), h.end(), vx[i].second)-h.begin();
			h[p] = vx[i].second;
		}
	}
	l=h.size();
	long double answer = (long double)((long double)100.0)*(xtwo - xone + ytwo - yone) - ((long double)l)*((long double)20.0) + ((long double)l)*(pii*((long double)5.0));
	long double subanswer = (long double)((long double)100.0)*(xtwo - xone + ytwo - yone) - ((long double)(l - 1))*((long double)20.0) + ((long double)(l - 1))*(pii*((long double)5.0));
	
	h.clear();
	for (int i = 0; i < (int)vy.size(); i++) {
		if(h.size()==0||h.back()<vy[i].second)h.push_back(vy[i].second);
		else{
			ll p = lower_bound(h.begin(), h.end(), vy[i].second)-h.begin();
			h[p] = vy[i].second;
		}
	}
	l=h.size();
	
	answer = min(answer, (long double)((long double)100.0)*(xtwo - xone + ytwo - yone) - ((long double)l)*((long double)20.0) + ((long double)l)*(pii*((long double)5.0)));
	subanswer = min(subanswer, (long double)((long double)100.0)*(xtwo - xone + ytwo - yone) - ((long double)(l - 1))*((long double)20.0) + ((long double)(l - 1))*(pii*((long double)5.0)));
	
	//check if got special case, then need + 1/2*pi*r
	if ((long long)vx.size() == min(xtwo - xone, ytwo - yone) + 1){
		bool ascending = true;
		for (int i = 0; i < vx.size() - 1; i++){
			if (vx[i].second >= vx[i + 1].second){
				ascending = false;
				break;
			}
		}
		if (ascending){
			answer = subanswer - ((long double)20.0) + ((long double)10.0)*pii;
			//answer += (pii*5.0);
		}
	}
	printf("%.20Lf\n", answer);
	
	
}


Measured memory_bytes: 13788