結果
| 問題 |
No.2804 Fixer And Ratism
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-07-12 23:21:08 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 61 ms / 2,000 ms |
| コード長 | 2,412 bytes |
| コンパイル時間 | 17,393 ms |
| コンパイル使用メモリ | 396,248 KB |
| 実行使用メモリ | 8,580 KB |
| 最終ジャッジ日時 | 2024-07-12 23:21:30 |
| 合計ジャッジ時間 | 20,588 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 31 |
ソースコード
fn main() {
input!{
n: usize, q: usize,
}
// 使用可能台数(可変)
let mut nn = n;
// 取り出す順(順序つき集合(値のみ))
let mut bst = BTreeSet::new();
// 在籍情報(人と値) (値と人)
let mut mp = BTreeMap::new();
let mut mp_rev = BTreeMap::new();
// クエリ毎に処理
for _ in 0..q {
input!{
nm: usize,
}
if nm == 1 {
input!{
s: String, t: usize,
}
// 人を追加
bst.insert(t);
mp.insert(s.clone(), t);
mp_rev.insert(t, s.clone());
// 定員を超えていたら取り出す
dropout(nn, &mut mp, &mut mp_rev, &mut bst);
}
else if nm == 2 {
input!{
x: usize,
}
// 定員を減らす
nn -= x;
// 定員を超えていたら取り出す
dropout(nn, &mut mp, &mut mp_rev, &mut bst);
}
else {
input!{
s: String, x: usize,
}
// 定員を増やす
nn += x;
// その人を優遇する 取り出して更新
update_info(s, &mut mp, &mut mp_rev, &mut bst);
}
}
}
fn update_info(s: String, mp: &mut BTreeMap<String, usize>, mp_rev: &mut BTreeMap<usize, String>, st: &mut BTreeSet<usize>) {
// if !mp.contains_key(&s) { return; }
let mut now_t = *mp.get(&s).unwrap();
mp.remove(&s);
mp_rev.remove(&now_t);
st.remove(&now_t);
if now_t < 100_000 { now_t += 100_000; } // 1度のみ
mp.insert(s.clone(), now_t);
mp_rev.insert(now_t, s);
st.insert(now_t);
}
fn dropout(n: usize, mp: &mut BTreeMap<String, usize>, mp_rev: &mut BTreeMap<usize, String>, st: &mut BTreeSet<usize>){
let mut now_sz = mp.len();
let mut ret = Vec::new();
while now_sz > n {
let (now_t, now_s) = mp_rev.pop_first().unwrap();
st.pop_first();
mp.remove(&now_s);
ret.push((now_t % 100_000, now_s));
now_sz -= 1;
}
ret.sort();
for i in 0..ret.len() {
println!("{}", ret[i].1);
}
}
// const MOD17: usize = 1000000007;
// const MOD93: usize = 998244353;
// const INF: usize = 1 << 60;
// let dx = vec![!0, 0, 1, 0]; // 上左下右
// let dy = vec![0, !0, 0, 1]; // 上左下右
// let d = vec!{(!0, 0), (0, !0), (1, 0), (0, 1)}; // 上左下右
#[allow(unused)]
use proconio::{input, marker::Chars, marker::Usize1};
#[allow(unused)]
use std::{
mem::swap,
cmp::min, cmp::max,
cmp::Reverse,
collections::HashSet, collections::BTreeSet,
collections::HashMap, collections::BTreeMap,
collections::BinaryHeap,
collections::VecDeque,
iter::FromIterator,
};