#include #include #include #include #include using namespace std; using i64 = long long; constexpr int V = 1e5; constexpr i64 INF = 0x3f3f3f3f3f3f3f3f; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int m, k; cin >> m >> k; vector> pt(m + 2); for (auto& [x, y] : pt) cin >> x >> y; auto get_dist = [&](const pair& from, const pair& to, int step) { auto [x1, y1] = from; auto [x2, y2] = to; return step == 0 ? (from == to ? 0 : INF) : (abs(x1 - x2) + abs(y1 - y2) - 1) / step; }; auto check = [&](int ans) { vector> edges(m + 2, vector(m + 2)); for (int i = 0; i <= m + 1; ++i) { for (int j = i + 1; j <= m + 1; ++j) edges[i][j] = edges[j][i] = get_dist(pt[i], pt[j], ans); } vector dist(m + 2, INF); priority_queue> nodes; nodes.emplace(dist[0] = 0, 0); while (!nodes.empty()) { auto [dis, u] = nodes.top(); nodes.pop(); dis = -dis; if (dis != dist[u]) continue; for (int v = 0; v <= m + 1; ++v) { if (dist[v] > dis + edges[u][v]) { dist[v] = dis + edges[u][v]; nodes.emplace(-dist[v], v); } } } return dist[1] <= k; }; int l = 1, r = V << 1; while (l < r) { int mid = l + ((r - l) >> 1); if (check(mid)) r = mid; else l = mid + 1; } cout << l << endl; return 0; }