#include<bits/stdc++.h>

using namespace :: std;

#define ll long long
#define mp make_pair
#define ld long double
#define F first
#define S second
#define pii pair<int,int>
#define pb push_back

const int maxn=2e5+500;
const int inf=1e9+900;
const int mod=1e9+7;

pair<int,int> tip,che;

ld lenght(pair<ld,ld> a){
	return sqrt(a.F*a.F+a.S*a.S);
}
bool mibin(pair<ld,ld> x){
		complex<ld> a,b;
		a.real(((ld)(che.F)-(x.F)));
		a.imag(((ld)(che.S)-(x.S)));
		b.real(((ld)(che.F)-(tip.F)));
		b.imag(((ld)(che.S)-(tip.S)));
		a*=-1;
		b*=-1;
		if(arg(a)<=0 && arg(b)<=0){
			return (arg(a)<=arg(b));
		}
		if(arg(a)>=0 && arg(b)>=0){
			return (arg(a)<=arg(b));
		}
		if(arg(a)>=0 && arg(b)<=0){
			return 1;
		}
		if(arg(a)<=0 && arg(b)>=0){
			return 0;
		}
		return (arg(a)<=arg(b));
}

void add(pair<int,int> x){
	if(mibin(mp((ld)x.F,(ld)x.S))){
		tip=x;
	}
}
ld mibine(pair<int,int> s,pair<int,int> t){
	pair<int,int> v=mp(t.F-s.F,t.S-s.S);
	if(!mibin(s)){
	//	cout<<"NOting\n";
		return 0;
	}
	if(mibin(t)){
	//	cout<<"ALL\n";
		return lenght(v);
	}
	ld b=0;
	ld e=1;
	for(int i=0;i<60;i++){
		ld mid=(e+b)/2;
		if(mibin(mp((s.F)+mid*(v.F),(s.S)+mid*(v.S)))){
			b=mid;
		}else{
			e=mid;
		}
	}
//	cout<<b<<endl;
	return lenght(v)*b;
}


int x[maxn];
int y[maxn];


int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	int n,h;
	cin>>n>>h;
	for(int i=0;i<n;i++){
		cin>>x[i]>>y[i];
	}
	ld ans=lenght(mp(x[n-1]-x[n-2],y[n-1]-y[n-2]));
	tip=mp(x[n-2],y[n-2]);
	che=mp(x[n-1],y[n-1]+h);
	for(int i=n-3;i>=0;i--){
		add(mp(x[i+1],y[i+1]));
		ans+=mibine(mp(x[i],y[i]),mp(x[i+1],y[i+1]));
	}
	cout<<fixed<<setprecision(10)<<ans;
}
