#include <stdio.h>
#include <bits/stdc++.h>			
 
#define pb push_back
#define pf push_front
#define pp pop_back
#define sz(a) (int)(a.size())
#define mp make_pair
#define F first
#define S second
#define next _next
#define prev _prev
#define left _left
#define right _right
#define y1 _y1
#define all(x) x.begin(), x.end()
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
const int N = (int)1e6 + 123;
const ll INF = (ll)1e18 + 123;
const int inf = (int)1e9 + 123;
const int MOD = (int)1e9 + 7;
const ld PI = 3.1415926535897;
 
void megaRandom() {
	unsigned int FOR;
 	asm("rdtsc" : "=A"(FOR));
  srand(FOR);
}
 
struct point {
	int x, y;
	void in() {
		cin >> x >> y;
	}
};
 
bool cmp(point a, point b) {
	return a.x < b.x;
}
 
bool cmp2(point a, point b) {
	return a.y < b.y;
}
 
point go_l, go_r, fountain[N];
int n;
int t[6*N], L[6*N], R[6*N], Sz = 1;
 
int get(int l, int r, int v = 1, int tl = 0, int tr = 1e8) {
	if(!v || l > r || tl > tr || tl > r || l > tr)
		return 0;
	if(l <= tl && tr <= r)
		return t[v];
	int mid = (tl + tr) >> 1;
	return max(get(l, r, L[v], tl, mid), get(l, r, R[v], mid + 1, tr));                                                        	
}
 
void upd(int pos, int val, int v = 1, int tl = 0, int tr = 1e8) {
	if(tl == tr) {
		t[v] = val;
		return;   
	}
	int mid = (tl + tr) >> 1;
	if(pos <= mid) {
		if(!L[v]) L[v] = ++ Sz;
		upd(pos, val, L[v], tl, mid);
	} else {
		if(!R[v]) R[v] = ++ Sz;
		upd(pos, val, R[v], mid + 1, tr);
	}
	t[v] = max(t[L[v]], t[R[v]]);
}
 
ld res1, res2;
int path;
 
int main() {
	megaRandom();
	go_l.in(), go_r.in();
	path = abs(go_l.x - go_r.x) + abs(go_l.y - go_r.y);
	int S = min(abs(go_l.x - go_r.x), abs(go_l.y - go_r.y)) + 1;
	if(go_l.x > go_r.x)
		swap(go_l, go_r);
	cin >> n;
	for(int i = 1; i <= n; i ++)
		fountain[i].in();
	sort(fountain + 1, fountain + n + 1, &cmp);
	int fountains = 0;
	for(int i = 1; i <= n; i ++) {
		if(fountain[i].x < go_l.x || fountain[i].x > go_r.x || fountain[i].y < min(go_l.y, go_r.y) || fountain[i].y > max(go_l.y, go_r.y))
			continue;
		//cout << "i: " << i << "\n";
		int now = 0;
		if(go_l.y <= go_r.y) now = get(0, fountain[i].y) + 1;
		else                 now = get(fountain[i].y, 1e8) + 1;
		upd(fountain[i].y, now);
		fountains = max(fountains, now);
	}

	if(fountains == S) {
	  res1 = 1ll * path * 100 - 1ll * (20 - 5ll * PI) * (fountains - 1) + (10ll * PI - 20);
	} else {
		res1 = 1ll * path * 100 - 1ll * (20 - 5ll * PI) * fountains;
	}
	//cout << " path: " << path << " fountains: " << fountains << "\n";
	//cout << res1 << "\n";
	//return 0;
	/*memset(t, 0, sizeof t);
	memset(L, 0, sizeof L);
	memset(R, 0, sizeof R);
	Sz = 1;
 
	if(go_l.y > go_r.y)
		swap(go_l, go_r);
	sort(fountain + 1, fountain + n + 1, &cmp2);	
	fountains = 0;
	for(int i = 1; i <= n; i ++) {
		if(fountain[i].x < go_l.x || fountain[i].x > go_r.x || fountain[i].y < min(go_l.y, go_r.y) || fountain[i].y > max(go_l.y, go_r.y))
			continue;
		int now = 0;
		if(go_l.x <= go_r.x) now = get(0, fountain[i].x) + 1;
		else                 now = get(fountain[i].x, 1e8) + 1;
		upd(fountain[i].x, now);
		fountains = max(fountains, now);	
	}
	if(fountains == S) {
	  res2 = path * 100 - (20 - 5 * PI) * (fountains - 1) + (10 * PI - 20);
	} else {
		res2 = path * 100 - (20 - 5 * PI) * fountains;
	}
 
	res1 = min(res1, res2);
  */
	cout << fixed << setprecision(12) << res1;
	return 0;         
}

Measured memory_bytes: 33024