結果
問題 |
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"); } } } }