#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
#include "bits/stdc++.h"
using namespace std;
#define int long long int
#define SYNC std::ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);
typedef long double ld;
typedef pair<ld,ld> ii;
typedef pair<int,ii> iii;
typedef vector<int> vi;
typedef vector<ii>   vii;
#define rep(i,l,r)   for (int i = (l); i < (r); i++)
#define here cout << " Hey!!\n";
#define  pb push_back
#define  F  first
#define  S  second
#define all(v) (v).begin(),(v).end()
#define sz(a) (int)((a).size())
#define sq(x) ((x)*(x))

const int MOD = 1e9+7;
const int MOD1 = 998244353;
const int N = 2e5+5;
const ld INF = 1000111000111000111LL;
const ld EPS = 1e-6;
const ld PI = 3.141592653589793116;


ld dist (ii x, ii y) {
    return sqrt(sq(x.F - y.F) + sq(x.S - y.S));
}

ld cal_angle(ii p, ii &eye) {
    return atan((eye.S - p.S)/(eye.F - p.F));
}

int32_t main()
{
    SYNC
    int n; cin >> n;
    ld H; cin >> H;
    vector<pair<ld, ld>> v(n);
    rep(i,0,n) {
        int x, y; cin >> x >> y;
        v[i] = {x, y};
    }
    ii eye = v[n-1];
    eye.S += H;
    if (n == 2) {
        cout << fixed << setprecision(9) << dist(v[0], v[1]) ;
        return 0;
    }
    vector<ld> a(n-1);
    for (int i = 0; i < n - 1; i++) {
        a[i] = cal_angle(v[i], eye);
    }
    for (int i = n - 3; i >= 0; i--) {
        a[i] = min(a[i+1], a[i]);
    }
    ld ans = 0;
    for (int i = 0; i < n - 1; i++) {
        if (i == n-2) {
            ans += dist(v[i], v[i+1]);
            break;
        }
        ld lim = a[i+1];
        ld lo = v[i].F, hi = v[i+1].F;
        ld grad = (v[i+1].S - v[i].S) / (hi - lo);
        int lol = 30;
        while (lol--) {
            ld mid = (lo + hi)/2;
            ld y = v[i].S + grad * (mid - v[i].F);
            ld now = cal_angle({mid, y}, eye);
            if (now <= lim) {
                lo = mid;
            } else {
                hi = mid;
            }
        }
        ld y = v[i].S + grad * (lo - v[i].F);
        ans += dist({lo, y}, v[i]);
    }
    cout << fixed << setprecision(9) << ans;
    return 0;
}