#include #include #include #include using namespace std; const int N = 1e3 + 5; const double PI = acos(-1.0), eps = 1e-8; struct Point { double x, y; Point () {} Point (double xx, double yy) : x(xx), y(yy) {} Point friend operator - (Point a, Point b) { return Point(a.x - b.x, a.y - b.y); } double friend operator ^ (Point a, Point b) { return a.x * b.y - b.x * a.y; } bool friend operator < (Point a, Point b) { if (a.y == b.y) return a.x < b.x; return a.y < b.y; } } p[N]; int n, L, q[N]; double dist (Point a, Point b){ return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } int Sign(double x) { if (x >= -eps && x <= eps) return 0; return x > eps ? 1 : -1; } bool cmp(Point a, Point b) { int s = Sign((a - p[1]) ^ (b - p[1])); if(s > 0 || (s == 0 && dist(a, p[1]) < dist(b, p[1]))) return 1; else return 0; } double Graham() { sort(p + 1, p + n + 1); sort(p + 1, p + n + 1, cmp); int top = 3; q[1] = 1, q[2] = 2, q[3] = 3; for (int i = 4; i <= n; i++) { while(top > 1 && Sign((p[q[top]] - p[q[top - 1]]) ^ (p[i] - p[q[top]])) <= 0) top--; q[++top] = i; } double res = 0; for (int i = 1; i < top; i++) res += dist(p[q[i]], p[q[i + 1]]); res += dist(p[q[1]], p[q[top]]); res += 2.0 * PI * L; return res; } int main() { // freopen("1.txt", "r", stdin); scanf("%d %d", &n, &L); for (int i = 1; i <= n; i++) scanf("%lf %lf", &p[i].x, &p[i].y); printf("%d\n", (int)(Graham() + 0.5)); return 0; }