use std::cmp::*; // https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8 macro_rules! input { ($($r:tt)*) => { let stdin = std::io::stdin(); let mut bytes = std::io::Read::bytes(std::io::BufReader::new(stdin.lock())); let mut next = move || -> String{ bytes.by_ref().map(|r|r.unwrap() as char) .skip_while(|c|c.is_whitespace()) .take_while(|c|!c.is_whitespace()) .collect() }; input_inner!{next, $($r)*} }; } macro_rules! input_inner { ($next:expr) => {}; ($next:expr,) => {}; ($next:expr, $var:ident : $t:tt $($r:tt)*) => { let $var = read_value!($next, $t); input_inner!{$next $($r)*} }; } macro_rules! read_value { ($next:expr, ( $($t:tt),* )) => { ($(read_value!($next, $t)),*) }; ($next:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| read_value!($next, $t)).collect::>() }; ($next:expr, $t:ty) => ($next().parse::<$t>().expect("Parse error")); } // https://yukicoder.me/problems/no/2354 (3) // 二分探索して最短路 (必要な明かりの個数を距離とする) // Tags: dijkstra-in-dense-graphs fn main() { input! { n: usize, k: i64, xy: [(i64, i64); n + 2], } let dist = |i: usize, j: usize| { let (xi, yi) = xy[i]; let (xj, yj) = xy[j]; (xi - xj).abs() + (yi - yj).abs() }; let mut pass = dist(0, 1); let mut fail = 0; while pass - fail > 1 { const INF: i64 = 1 << 50; let mid = (pass + fail) / 2; let mut tbl = vec![INF; n + 2]; let mut dec = vec![false; n + 2]; let mut rem = n + 2; tbl[0] = 0; // O(n^2) while rem > 0 { let mut mi = (INF, 0); for i in 0..n + 2 { if !dec[i] { mi = min(mi, (tbl[i], i)); } } let now = mi.1; dec[now] = true; rem -= 1; for i in 0..n + 2 { if dec[i] { continue; } let d = dist(now, i); tbl[i] = min(tbl[i], mi.0 + (d - 1) / mid); } } if tbl[1] <= k { pass = mid; } else { fail = mid; } } println!("{}", pass); }