結果
| 問題 |
No.1332 Range Nearest Query
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2021-02-15 19:47:06 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 523 ms / 2,500 ms |
| コード長 | 1,963 bytes |
| コンパイル時間 | 13,333 ms |
| コンパイル使用メモリ | 387,436 KB |
| 実行使用メモリ | 66,504 KB |
| 最終ジャッジ日時 | 2024-07-23 11:49:31 |
| 合計ジャッジ時間 | 30,646 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 48 |
ソースコード
fn read() -> (Vec<u32>, Vec<(usize, usize, u32)>) {
use std::io::*;
let mut s = String::new();
std::io::stdin().read_to_string(&mut s).unwrap();
let mut it = s.trim().split_whitespace();
let mut next = || it.next().unwrap().parse::<u32>().unwrap();
let n = next();
let x = (0..n).map(|_| next()).collect::<Vec<_>>();
let q = next();
let ask = (0..q).map(|_| {
let l = next() as usize - 1;
let r = next() as usize;
let x = next();
(l, r, x)
}).collect::<Vec<_>>();
(x, ask)
}
fn main() {
let (x, ask) = read();
let size = x.len().next_power_of_two();
let mut seg = vec![vec![]; 2 * size];
for (seg, x) in seg[size..].iter_mut().zip(x.into_iter()) {
seg.push(x);
}
for i in (1..size).rev() {
let mut a = Vec::with_capacity(seg[2 * i].len() + seg[2 * i + 1].len());
a.extend_from_slice(&seg[2 * i]);
a.extend_from_slice(&seg[2 * i + 1]);
a.sort();
a.dedup();
seg[i] = a;
}
let calc = |a: &[u32], x: u32| -> u32 {
let y = a.binary_search_by_key(&(x, 0), |a| (*a, 1)).unwrap_err();
let mut ans = std::u32::MAX;
a.get(y).map(|a| ans = ans.min(*a - x));
a.get(y - 1).map(|a| ans = ans.min(x - *a));
ans
};
let find = |mut l: usize, mut r: usize, x: u32| -> u32 {
l += size;
r += size;
let mut ans = std::u32::MAX;
while l < r {
if l & 1 == 1 {
ans = ans.min(calc(&seg[l], x));
l += 1;
}
if r & 1 == 1 {
r -= 1;
ans = ans.min(calc(&seg[r], x));
}
l >>= 1;
r >>= 1;
}
ans
};
use std::io::Write;
let out = std::io::stdout();
let mut out = std::io::BufWriter::new(out.lock());
for (l, r, x) in ask {
writeln!(out, "{}", find(l, r, x)).ok();
}
}
akakimidori