diff --git a/storage/zeta/rs/31159.rs b/storage/zeta/rs/31159.rs new file mode 100644 index 0000000..18351fb --- /dev/null +++ b/storage/zeta/rs/31159.rs @@ -0,0 +1,74 @@ +use std::cmp::{max, min}; +use std::io::stdin; + +fn pair_matching(vs: &Vec<(i32, i32)>, i: usize, j: usize) -> i32 { + let (v0, v1) = (vs[i], vs[j]); + max( + max((v0.0 - v1.0).abs(), (v0.1 - v1.1).abs()), + max((v0.0 - v1.1).abs(), (v0.1 - v1.0).abs()), + ) +} + +fn solve_max_pair_matching(n: i32, vs: &Vec<(i32, i32)>) -> i32 { + let vs_index: Vec = (0..(2 * n as usize)).collect(); + + let mut vs_index_min = vs_index.clone(); + let mut vs_index_max = vs_index.clone(); + vs_index_min.sort_by_key(|&x| min(vs[x].0, vs[x].1)); + vs_index_max.sort_by_key(|&x| max(vs[x].0, vs[x].1)); + + let mut vs_index_presence = vec![true; 2 * n as usize]; + + let mut s = 0; + + let mut min_point = 0; + let mut max_point = 2 * n as usize - 1; + let mut cnt = 0; + while cnt < n { + if !vs_index_presence[vs_index_min[min_point]] { + min_point += 1; + continue; + } + if !vs_index_presence[vs_index_max[max_point]] { + max_point -= 1; + continue; + } + if vs_index_min[min_point] == vs_index_max[max_point] { + if min_point == 2 * n as usize - 1 { + max_point -= 1; + } else { + min_point += 1; + } + continue; + } + cnt += 1; + s += pair_matching(vs, vs_index_min[min_point], vs_index_max[max_point]); + vs_index_presence[vs_index_min[min_point]] = false; + vs_index_presence[vs_index_max[max_point]] = false; + min_point += 1; + max_point -= 1; + } + + s +} + +fn main() { + let mut line = String::new(); + stdin().read_line(&mut line).unwrap(); + let n = line.trim().parse::().unwrap(); + drop(line); + let vs = (0..(2 * n)) + .map(|_| { + let mut line = String::new(); + stdin().read_line(&mut line).unwrap(); + let v: Vec = line + .trim() + .split(' ') + .map(|x| x.parse::().unwrap()) + .collect(); + (v[0], v[1]) + }) + .collect::>(); + + println!("{}", solve_max_pair_matching(n, &vs)); +}