#include using namespace std; typedef long long ll; typedef long double lf; typedef pair pii; typedef pair pll; #define TRACE(x) cerr << #x << ' ' << x << endl #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define REP(i, n) FOR(i, 0, n) #define _ << ' ' << #define x first #define y second #define fi first #define sec second #define se second #define mp make_pair #define pb push_back const int MAXN = 410; int n; typedef pair pt; pt P[MAXN]; pt A, B; lf dist(pt a, pt b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } lf distZ(pt a, pt b, lf va, lf vb) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (va - vb)*(va-vb)); } bool is_in (pt t) { int cnt = 0; REP(i, n) { int j = (i + 1) % n; if (abs(P[i].y - P[j].y) < 1e-12) continue; if (t.y <= max(P[i].y, P[j].y) && t.y >= min(P[i].y, P[j].y) && P[i].x <= t.x) cnt++; } return (cnt % 2); } vector > v; lf f(pt p) { lf ret = 1e18; if (is_in(p) == 0) return 0; REP(i, n) { int j = (i + 1) % n; lf dist1 = dist(P[i], p); lf dist2 = dist(P[j], p); pt p2; if (P[i].x == P[j].x) { p2 = {P[i].x, p.y}; } else { p2 = {p.x, P[i].y}; } lf dist3 = dist(p, p2); if (dist1 <= dist2 && dist1 <= dist3) { ret = min(ret, max(abs(P[i].x-p.x), abs(P[i].y-p.y))); } else if (dist2 <= dist1 && dist2 <= dist3) { ret = min(ret, max(abs(P[j].x-p.x), abs(P[j].y-p.y))); } else { ret = min(ret, max(abs(p2.x-p.x), abs(p2.y-p.y))); } } return ret; } int REPE = 0; lf solve() { pt tmp = A; lf deltax = 0.5, deltay = 0; if (A.x == B.x) { deltax = 0; deltay = 0.5; if (A.y > B.y) deltay = -deltay; } else { if (A.x > B.x) deltax = -deltax; deltay = deltax * (A.y - B.y) / (A.x - B.x); } lf sol = 0.0; lf last = f(tmp); REP(tt, REPE) { pt tmp_next = {tmp.x + deltax, tmp.y + deltay}; lf h1, h2; h1 = last; h2 = f(tmp_next); sol += distZ(tmp, tmp_next, h1, h2); tmp = tmp_next; last = h2; } return sol; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; int a, b, c, d; cin >> a >> b >> c >> d; if (a == c) { REPE = abs(b - d) * 2; } else { REPE = abs(a - c) * 2; } A = {a, b}; B = {c, d}; REP(i, n) { cin >> P[i].fi >> P[i].sec; } cout << fixed << setprecision(10) << solve() << endl; return 0; }