#include <iostream>
#include <vector>
#include <deque>
#include <math.h>
#include <set>
#include <iomanip>
#include <time.h>
#include <list>
#include <stdio.h>
#include <queue>
#include <map>
#include <algorithm>
#include <assert.h>
#include <memory.h>

#define mk make_pair
#define sc second
#define fr first
#define pb emplace_back
#define all(s) s.begin(), s.end()
#define sz(s) ( (int)s.size() )
#define int long long
//#define double long double

using namespace std;

const int N = 2e5 + 5, mx = 1e8 - 1, M = 1e7;

double F = 4.2920367320510338076867830836025, Q = 11.415926535897932384626433832795;

int n, dp[N], Sz = 1, ans;

pair <int, int> st, en, p[N];

bool cmp (pair <int, int> a, pair <int, int> b)
{
    return a.sc < b.sc;
}
inline bool Check1 ()
{
    if ( en.sc - st.sc + 1 > n )
        return false;

    int cn = 0, last = -1;

    for (int i = 1; i <= n; i++)
    {
        if ( p[i].sc >= st.sc && p[i].sc <= en.sc && p[i].fr >= st.fr && p[i].fr <= en.fr  )
        {
            cn++;
            if ( p[i].fr < last )
                return false;
            last = p[i].fr;
        }
    }
    return cn == (en.sc - st.sc + 1);
}
inline bool Check2 ()
{
    if ( en.fr - st.fr + 1 > n )
        return false;

    int cn = 0, last = -1;

    for (int i = 1; i <= n; i++)
    {
        if ( p[i].fr >= st.fr && p[i].fr <= en.fr  && p[i].sc >= st.sc && p[i].sc <= en.sc )
        {
            cn++;
            if ( p[i].sc < last )
                return false;
            last = p[i].sc;
        }
    }
    return cn == (en.fr - st.fr + 1);
}
struct st
{
    int val, l, r;
}
t[M];

int get (int l, int r, int v = 1, int tl = 0, int tr = 1e8)
{
    if (l > tr || tl > r || v == 0)
        return 0;

    if (l <= tl && tr <= r)
        return t[v].val;

    int tm = (tl + tr) >> 1;

    return max( get(l, r, t[v].l, tl, tm), get(l, r, t[v].r, tm + 1, tr) );
}
void update (int pos, int val, int v = 1, int tl = 0, int tr = 1e8)
{
    if (tl == tr)
    {
        t[v].val = max( t[v].val, val );
    }
    else
    {
        int tm = (tl + tr) >> 1;
        if (pos <= tm)
        {
            if (!t[v].l) t[v].l = ++Sz;
            update( pos, val, t[v].l, tl, tm );
        }
        else {
            if (!t[v].r) t[v].r = ++Sz;
            update( pos, val, t[v].r, tm + 1, tr );
        }
        t[v].val = max(t[ t[v].l ].val , t[ t[v].r ].val);
    }
}
main ()
{
    cin >> st.fr >> st.sc >> en.fr >> en.sc;
    cin >> n;
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &p[i].fr, &p[i].sc);

    if ( st.fr > en.fr )
        swap(st, en);

    if (st.sc > en.sc)
    {
        st.fr = mx - st.fr;
        en.fr = mx - en.fr;
        for (int i = 1; i <= n; i++)
            p[i].fr = mx - p[i].fr;
        swap(st, en);
    }
    sort( p + 1, p + n + 1, cmp );
    if ( Check1() )
    {
        cout << fixed << setprecision(12) << (long double)(en.sc - st.sc) * 100 + (en.fr - st.fr) * 100 - F * (en.sc - st.sc) + Q << endl;
        return 0;
    }
    sort( p + 1, p + n + 1 );
    if ( Check2() )
    {
        cout << fixed << setprecision(12) << (long double)(en.sc - st.sc) * 100 + (en.fr - st.fr) * 100 - F * (en.fr - st.fr) + Q << endl;
        return 0;
    }
    for (int i = 1; i <= n; i++)
    {
        if ( p[i].fr < st.fr || p[i].fr > en.fr || p[i].sc < st.sc || p[i].sc > en.sc ) continue;

        dp[i] = get( 0, p[i].sc ) + 1;

        ans = max(ans, dp[i]);

        update( p[i].sc, dp[i] );
    }
    cout << fixed << setprecision(12) << (en.sc - st.sc) * 100 + (en.fr - st.fr) * 100 - F * ans << endl;
}


Measured memory_bytes: 55040