結果
| 問題 |
No.3072 Speedrun Query
|
| コンテスト | |
| ユーザー |
urectanc
|
| 提出日時 | 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());
}
urectanc