この記事でやること
Python3のheapqを使い、以下の操作ができるデータ構造を実装します:
- push(x): xを追加
- erase(x): xを削除
- get_min(): 最小値を取得
- get_max(): 最大値を取得
ソースコードはご自由にお使いください。
前提知識:(最小)ヒープとは
以下の操作ができるデータ構造です:
- push(x): xを追加
- pop(): 最小値を削除
- get(): 最小値を取得
仕組みが知りたい方はwikipediaを参照してください。
(このwikiによると、指定キー削除は二分ヒープのノードを指すポインタを別に管理することでできるようなので、ヒープを一から自作するなら参考にするとよいと思います。)
発想
push(x), get_min(), get_max()
最小ヒープと最大ヒープを両方持っておくだけで実現できます。heapqは最小ヒープなので、最大ヒープとして扱いたければデータを-1倍してpushすればいいでしょう。
erase(x)
遅延評価というテクニックを使って実現します。
実際にヒープから削除するのではなく、「xは削除済みである。」という情報だけ記憶しておきます。そして、後のget_min(), max_min()でもしxが取得されたなら、そのタイミングでヒープからpopします。
実装では、連想配列(defaultdict)で各要素の個数を管理しておき、個数が0のものがgetされたらヒープからpopするようにしています。
ソースコード
(Python3.8.3)
使用例:
ABC253-C問題
Submission #33418423 - NOMURA Programming Contest 2022(AtCoder Beginner Contest 253)