#include <bits/stdc++.h>
#include <assert.h>
using namespace std;
typedef long long ll;
typedef __float128 ld;
#define PB push_back
#define MP make_pair
#define MOD 1000000007LL
#define endl "\n"
#define fst first
#define snd second
const ll UNDEF = -1;
const ll INF=1e18;
template<typename T> inline bool chkmax(T &aa, T bb) { return aa < bb ? aa = bb, true : false; }
template<typename T> inline bool chkmin(T &aa, T bb) { return aa > bb ? aa = bb, true : false; }
typedef pair<ll,ll> pll;
typedef vector<ll> vll;
typedef pair<int,int> pii;
 
 
 
const ll MAXSEG = 4e5+4;  // limit for array size
ll segn=MAXSEG;  // array size
typedef ll S;
S t[2 * (MAXSEG+1)];
S identity = 0;
S combine(const S& lefts, const S& rights) {
	return max(lefts,rights);
}
void build(S *t) {  // build the tree
	ll n=segn;
  for (ll i = n - 1; i > 0; --i) t[i] = combine(t[i<<1], t[i<<1|1]);
}
 
void modify(ll p, const S& value) { // set value at position p
	ll n=segn;
  for (t[p += n] = value; p >>= 1; ) t[p] = combine(t[p<<1], t[p<<1|1]);
}
 
S query(ll l, ll r) { // sum on interval [l, r]
	r++;
	ll n=segn;
  S resl=identity, resr=identity;
  for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
    if (l&1) resl = combine(resl, t[l++]);
    if (r&1) resr = combine(t[--r], resr);
  }
  return combine(resl, resr);
}
 
 
 
 
const ll REFL=1e8;
bool cmp(const pll &a, const pll &b) {
	if (a.fst==b.fst) {
		return a.snd>b.snd;
	}
	return a.fst>b.fst;
}
void makeunique(vector<ll> &vx) {
  sort(vx.begin(),vx.end());
  auto it=unique(vx.begin(),vx.end());
  vx.resize(std::distance(vx.begin(),it));
}
ll bins(vector<ll> &vx, ll x) {
  ll imin=0,imax=vx.size();
  while(imin<imax) {
    ll imid=(imin+imax)>>1;
    if (vx[imid]<x) imin=imid+1;
    else imax=imid;
  }
  return imin;
}
ld QUARTER=3.141592653589793238462643383279502884197169399375105820974944592307816406286L*5.0L;
void solve(vector<long long> ox, vector<long long> oy, long long n, vector<long long> vx, vector<long long> vy){
	cout<<fixed<<setprecision(20);
	if (ox[0]>ox[1]) {
		swap(ox[0],ox[1]);
		swap(oy[0],oy[1]);
	}
	ll sx=ox[0],sy=oy[0];
	ll tx=ox[1],ty=oy[1];
	if (sy>ty) {
		sy=-sy;
		ty=-ty;
		for (auto &y:vy) {
			y=-y;
		}
	}
	//for (ll i=0;i<vx.size();i++) {
	//	ll x=vx[i],y=vy[i];
	//	printf("%d %d\n",x,y);
	//}
	if (sx==tx||sy==ty) {
		ll hit=0;
		for (ll i=0;i<vx.size();i++) {
			ll x=vx[i],y=vy[i];
			if (sx<=x&&x<=tx&&sy<=y&&y<=ty) {
				hit++;
			}
		}
		ld ans=100.0L*(abs(tx-sx)+abs(ty-sy))+2ll*(QUARTER-10)*hit;
		cout<<(long double)ans<<endl; return;
	}
	vector<pll> vp;
	vector<ll> by;
	for (ll i=0;i<vx.size();i++) {
		ll x=vx[i],y=vy[i];
		if (sx<=x&&x<=tx&&sy<=y&&y<=ty) {
			vp.PB(MP(x,y));
			by.PB(y);
		}
	}
	sort(vp.begin(),vp.end(),cmp);
  makeunique(by);
  for (ll i=0;i<vp.size();i++) {
    ll x=vp[i].fst,y=vp[i].snd;
    vp[i].snd=bins(by,y);
  }
  ll ylim=MAXSEG-1;
  assert(by.size()<ylim);
  ll best=0;
  for (ll i=0;i<vp.size();i++) {
  	ll y=vp[i].snd;
  	ll got=query(y+1,ylim);
  	//printf("x:%d y:%d. got:%d\n",vp[i].fst,y,got);
  	got++;
  	chkmax(best,got);
  	modify(y,got);
  }
  ld save=20-QUARTER;
  ld final=100.0L*(abs(sx-tx)+abs(sy-ty))-save*best;
  ll ddist=min(abs(sx-tx),abs(sy-ty))+1;
  //printf("ddist:%lld save:%lld. %lld %lld\n",ddist,save,abs(sx-tx),abs(sy-ty));
  if (best==ddist)final+=save+2*(QUARTER-10);
  cout<<(long double)final<<endl;
}
 
int main(){	
	ios_base::sync_with_stdio(false); cin.tie(0);
	vector<long long> x(2-1+1);
	vector<long long> y(2-1+1);
	long long N;
	for(ll i = 0 ; i <= 2-1 ; i++){
		scanf("%lld",&x[i]);
		scanf("%lld",&y[i]);
	}
	scanf("%lld",&N);
	vector<long long> X(N-1+1);
	vector<long long> Y(N-1+1);
	for(ll i = 0 ; i <= N-1 ; i++){
		scanf("%lld",&X[i]);
		scanf("%lld",&Y[i]);
	}
	solve(x, y, N, X, Y);
	return 0;
}


Measured memory_bytes: 19564