// Slower C++ solution:
#include <bits/stdc++.h>

 

 

using namespace std;



 

const int INF = (int) 1e9;



struct point {

	int x;

    int y;

	point() : x(0), y(0) {}

};

 

struct fenwick_tree {

	int n;

	unordered_map<int, int> F;

 

    fenwick_tree() : n(INF) {

        F.rehash((int) 3e5);

    }

	void upd(int i, int x) {

		for (; i < n; i |= i + 1)

			F[i] = max(F[i], x);

	} 

	int get(int i) {

		int res = 0;

		for (; i >= 0; i &= i + 1, --i)

			res = max(res, F[i]);

		return res;

	}

};

 

 

bool cmp(point a, point b) {

    return make_pair(a.x, a.y) < make_pair(b.x, b.y); 

}

 

 

int main() {

#ifdef NICK

	freopen("input.txt", "r", stdin);

#else



#endif

    point start, finish;

    int n;

    cin >> start.x >> start.y;

    cin >> finish.x >> finish.y;

    cin >> n;

    point p[n];

    for (int i = 0; i < n; i++) {

        cin >> p[i].x >> p[i].y;

    }

    if (start.x > finish.x)

        swap(start, finish);

    if (start.y > finish.y) {

        finish.y = 2 * start.y - finish.y;

        for (int i = 0; i < n; i++) {

            p[i].y = 2 * start.y - p[i].y;

        }

    }

    vector<point> a;

    for (int i = 0; i < n; i++) {

        if (start.x <= p[i].x && p[i].x <= finish.x && start.y <= p[i].y && p[i].y <= finish.y)

            a.emplace_back(p[i]);

    }

    fenwick_tree dp;

    sort(a.begin(), a.end(), cmp);

    for (int i = 0; i < (int)a.size(); ++i)

        dp.upd(a[i].y, dp.get(a[i].y) + 1);

    int cur = dp.get(INF);

    long double ans = 0;

    if (cur != min(finish.y - start.y, finish.x - start.x) + 1)

        ans = 100.0 * (finish.y + finish.x - start.y - start.x) - 20.0 * cur + 5 * M_PI * cur;

    else

        ans = 100.0 * (finish.y + finish.x - start.x - start.y) - 20.0 * cur + 5 * M_PI * (cur - 1) + 10 * M_PI;

    cout << fixed << setprecision(13) << ans << "\n";

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.4814940440598583x):
#include <bits/stdc++.h>

 

 

using namespace std;



 

const int INF = (int) 1e9;



struct point {

	int x;

    int y;

	point() : x(0), y(0) {}

};

 

struct fenwick_tree {

	int n;

	unordered_map<int, int> F;

 

    fenwick_tree() : n(INF) {

        F.rehash((int) 1.8e5);

    }

	void upd(int i, int x) {

		for (; i < n; i |= i + 1)

			F[i] = max(F[i], x);

	} 

	int get(int i) {

		int res = 0;

		for (; i >= 0; i &= i + 1, --i)

			res = max(res, F[i]);

		return res;

	}

};

 

 

bool cmp(point a, point b) {

    return make_pair(a.x, a.y) < make_pair(b.x, b.y); 

}

 

 

int main() {

#ifdef NICK

	freopen("input.txt", "r", stdin);

#else



#endif

    point start, finish;

    int n;

    cin >> start.x >> start.y;

    cin >> finish.x >> finish.y;

    cin >> n;

    point p[n];

    for (int i = 0; i < n; i++) {

        cin >> p[i].x >> p[i].y;

    }

    if (start.x > finish.x)

        swap(start, finish);

    if (start.y > finish.y) {

        finish.y = 2 * start.y - finish.y;

        for (int i = 0; i < n; i++) {

            p[i].y = 2 * start.y - p[i].y;

        }

    }

    vector<point> a;

    for (int i = 0; i < n; i++) {

        if (start.x <= p[i].x && p[i].x <= finish.x && start.y <= p[i].y && p[i].y <= finish.y)

            a.emplace_back(p[i]);

    }

    fenwick_tree dp;

    sort(a.begin(), a.end(), cmp);

    for (int i = 0; i < (int)a.size(); ++i)

        dp.upd(a[i].y, dp.get(a[i].y) + 1);

    int cur = dp.get(INF);

    long double ans = 0;

    if (cur != min(finish.y - start.y, finish.x - start.x) + 1)

        ans = 100.0 * (finish.y + finish.x - start.y - start.x) - 20.0 * cur + 5 * M_PI * cur;

    else

        ans = 100.0 * (finish.y + finish.x - start.x - start.y) - 20.0 * cur + 5 * M_PI * (cur - 1) + 10 * M_PI;

    cout << fixed << setprecision(13) << ans << "\n";

	return 0;

}