結果
問題 | No.3072 Speedrun Query |
ユーザー |
![]() |
提出日時 | 2025-03-24 18:51:15 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 111 ms / 2,500 ms |
コード長 | 1,734 bytes |
コンパイル時間 | 13,728 ms |
コンパイル使用メモリ | 403,124 KB |
実行使用メモリ | 33,392 KB |
最終ジャッジ日時 | 2025-03-24 18:51:35 |
合計ジャッジ時間 | 17,941 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 21 |
ソースコード
use std::fmt::Write;use proconio::{input, marker::Usize1};fn main() {input! {n: usize, k_a: usize, k_b: usize,a: [Usize1; k_a],b: [Usize1; k_b],q: usize,query: [(Usize1, Usize1); q],}let dist = |a: &[usize]| {let mut res = vec![!0; n];let k = a.len();let mut j = 0;for i in 0..n {if j > 0 {res[i] = res[i].min(i.abs_diff(a[j - 1]));}if j < k {res[i] = res[i].min(i.abs_diff(a[j]));}if j < k && i == a[j] {j += 1;}}res};let dist_a = dist(&a);let dist_b = dist(&b);let dist_ab = {let mut mixed = Vec::with_capacity(k_a + k_b);for &a in &a {mixed.push((a, true));}for &b in &b {mixed.push((b, false));}mixed.sort_unstable_by_key(|t| t.0);mixed.windows(2).filter_map(|w| {if w[0].1 != w[1].1 {Some(w[1].0 - w[0].0)} else {None}}).min().unwrap()};eprintln!("{:?}", dist_ab);let mut output = String::new();for (s, t) in query {let d = s.abs_diff(t);let d_a = dist_a[s] + dist_a[t];let d_b = dist_b[s] + dist_b[t];let d_ab = dist_a[s] + dist_ab + dist_b[t];let d_ba = dist_b[s] + dist_ab + dist_a[t];let ans = d.min(d_a).min(d_b).min(d_ab).min(d_ba);writeln!(&mut output, "{ans}").unwrap();}println!("{}", output.trim_end());}