#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using pii = pair<int,int>;
using ld = long double;
#define um unordered_map
#define f(i,a,b) for (int i = a; i < b; i++)
#define Max(a,b) a=max(a,b)
#define IN(i,a,b) (a<=i&&i<=b)
#define pb push_back
const int mxn = 4e5+7;
struct BIT {
um<int,int> tree;
void cmod(int i, int x) {
for (; i < mxn; i |= i+1)
Max(tree[i],x);
}
int query(int i) {
int ans = 0;
for (; i >= 0; i = (i&(i+1))-1)
if (tree.count(i))
Max(ans,tree[i]);
return ans;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
clock_t start = clock();
#endif
int x1,y1,x2,y2,n;
cin>>x1>>y1>>x2>>y2>>n;
ld res = 100LL*(abs(x1-x2)+abs(y1-y2));
vi X,Y;
f(i,0,n) {
int x,y;
cin>>x>>y;
if ((IN(x,x1,x2)||IN(x,x2,x1))&&
(IN(y,y1,y2)||IN(y,y2,y1))) {
X.pb(x); Y.pb(y);
}
}
n = X.size();
if (x1>x2) {
swap(x1,x2);
f(i,0,n) X[i] = x2-X[i]+x1;
}
if (y1>y2) {
swap(y1,y2);
f(i,0,n) Y[i] = y2-Y[i]+y1;
}
map<int,int> com;
f(i,0,n) com[Y[i]]=0;
int t = 0;
for (pii pp : com)
com[pp.first] = t++;
f(i,0,n) Y[i] = com[Y[i]];
vi p(n);
f(i,0,n) p[i] = i;
sort(begin(p),end(p),[&](int i, int j) {
return X[i] < X[j];
});
BIT ds;
int num = 0;
f(j,0,n) {
int i = p[j];
int z = ds.query(Y[i])+1;
ds.cmod(Y[i],z);
Max(num,z);
}
if (((x1==x2)||(y1==y2))&&n)
res += 10*M_PI-20;
else
res += num*(5*M_PI-20);
cout << setprecision(30) << res << endl;
#ifdef LOCAL
cout << setprecision(12) << (long double)(clock()-start) / CLOCKS_PER_SEC << endl;
#endif
return 0;
}