← 一覧に戻る

C. Understory

問題ページへ

解説

~が~以上/以下の間~するみたいなそういう問題では大体の場合 ヒープ が使えます(多分)。ヒープを使うと、毎クエリでヒープのトップが h 以下の間、ポップし続ければいい話です。

// MinHeapは自前の型です。最小ヒープ(小さいのがトップに来るヒープ)のことです。
fn main() {
    let mut sc = Scanner::new();
    let mut wr = Writer::new();

    input!(
        sc,
        q: usize
    );

    let mut hq: MinHeap<usize> = MinHeap::new();

    for _ in 0..q {
        input!(
            sc,
            t, h: usize
        );

        match t {
            1 => {
                // ヒープに h を入れる
                hq.push(h);
            }
            2 => {
                while let Some(top) = hq.pop() {
                    // ヒープの最小値が h よりも大きくなったら取り出し終了
                    if top > h {
                        hq.push(top);
                        break;
                    }
                }
            }
            _ => {}
        }

        // ヒープの要素数(木の本数)を出力
        wr.println(hq.len());
    }
}

提出コード(Rust)
https://atcoder.jp/contests/abc451/submissions/74529161