結果
問題 |
No.3298 K-th Slime
|
ユーザー |
|
提出日時 | 2025-10-05 16:18:56 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 93 ms / 2,000 ms |
コード長 | 2,216 bytes |
コンパイル時間 | 11,920 ms |
コンパイル使用メモリ | 400,648 KB |
実行使用メモリ | 9,728 KB |
最終ジャッジ日時 | 2025-10-05 16:19:12 |
合計ジャッジ時間 | 14,157 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 25 |
コンパイルメッセージ
warning: method `first` is never used --> src/main.rs:19:8 | 11 | impl<T: Ord + Copy> BTreeMultiSet<T> { | ------------------------------------ method in this implementation ... 19 | fn first(&self) -> Option<&T> { | ^^^^^ | = note: `#[warn(dead_code)]` on by default
ソースコード
#![allow(unstable_name_collisions)] use std::collections::BTreeMap; use proconio::input; #[derive(Debug)] struct BTreeMultiSet<T> { length: usize, counts: BTreeMap<T, usize>, } impl<T: Ord + Copy> BTreeMultiSet<T> { fn new() -> Self { Self { length: 0, counts: BTreeMap::new() } } fn insert(&mut self, value: T) { self.length += 1; *self.counts.entry(value).or_default() += 1; } fn first(&self) -> Option<&T> { self.counts.keys().next() } fn last(&self) -> Option<&T> { self.counts.keys().rev().next() } fn pop_first(&mut self) -> Option<T> { let mut count_entry = self.counts.first_entry()?; self.length -= 1; *count_entry.get_mut() -= 1; if *count_entry.get() == 0 { Some(count_entry.remove_entry().0) } else { Some(*count_entry.key()) } } fn pop_last(&mut self) -> Option<T> { let mut count_entry = self.counts.last_entry()?; self.length -= 1; *count_entry.get_mut() -= 1; if *count_entry.get() == 0 { Some(count_entry.remove_entry().0) } else { Some(*count_entry.key()) } } } impl<T: Ord + Copy> From<&[T]> for BTreeMultiSet<T> { fn from(value: &[T]) -> Self { let mut ret = Self::new(); for v in value { ret.insert(*v); } ret } } fn main() { input! { n: usize, k: usize, q: usize, mut a: [i64; n], } a.sort(); let mut less = BTreeMultiSet::from(&a[..k]); let mut greater = BTreeMultiSet::from(&a[k..]); for _ in 0..q { input! { query: u8 } match query { 1 => { input! { x: i64 } less.insert(x); greater.insert(less.pop_last().unwrap()); } 2 => { input! { y: i64 } let temp = less.pop_last().unwrap(); greater.insert(temp + y); less.insert(greater.pop_first().unwrap()); } 3 => { println!("{}", less.last().unwrap()); } _ => {} } } }