結果
| 問題 |
No.2325 Skill Tree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-06-10 18:09:07 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 485 ms / 3,000 ms |
| コード長 | 2,404 bytes |
| コンパイル時間 | 14,491 ms |
| コンパイル使用メモリ | 377,716 KB |
| 実行使用メモリ | 22,656 KB |
| 最終ジャッジ日時 | 2025-01-02 23:35:56 |
| 合計ジャッジ時間 | 32,545 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 36 |
ソースコード
use std::{cmp::Reverse, collections::BinaryHeap};
fn main() {
let n = {
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
line.trim().parse::<usize>().unwrap()
};
let mut la: Vec<_> = (0..(n - 1))
.map(|_| {
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
let mut iter = line.split_whitespace();
(
iter.next().unwrap().parse::<usize>().unwrap(),
iter.next().unwrap().parse::<usize>().unwrap() - 1,
)
})
.collect();
la.insert(0, (0, 0));
let q = {
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
line.trim().parse::<usize>().unwrap()
};
let queries: Vec<_> = (0..q)
.map(|_| {
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
let mut iter = line.split_whitespace();
(
iter.next().unwrap().parse::<usize>().unwrap(),
iter.next().unwrap().parse::<usize>().unwrap(),
)
})
.collect();
let mut graph = vec![vec![]; n];
for i in 1..n {
graph[la[i].1].push(i);
}
let mut req_levels: Vec<Option<usize>> = vec![None; n];
req_levels[0] = Some(0);
let mut heap = BinaryHeap::from(vec![(Reverse(0), 0)]);
while let Some((Reverse(level), cur)) = heap.pop() {
for &next in &graph[cur] {
let next_req_level = &mut req_levels[next];
let candidate_req_level = level.max(la[next].0);
if next_req_level.is_none() || candidate_req_level < next_req_level.unwrap() {
*next_req_level = Some(candidate_req_level);
heap.push((Reverse(candidate_req_level), next));
}
}
}
let mut levels: Vec<usize> = req_levels
.iter()
.filter_map(|&rep_level| rep_level)
.collect();
levels.sort_unstable();
for &(qt, v) in &queries {
if qt == 1 {
let ans = levels.partition_point(|&level| level <= v);
println!("{}", ans);
} else {
if let Some(ans) = req_levels[v - 1] {
println!("{}", ans);
} else {
println!("-1");
}
}
}
}