イバコの生存記録

いまは競プロ(AtCoder)記事がメインです。

データ構造

123. C# でBitSetを自作した話と、C# の定数倍高速化について少し

昨日の ABC258-G問題で BitSet という(C++の)データ構造を利用する想定の問題が出ました*1。 atcoder.jp BitSet は、MultiSet と同じく C# には(似たようなものはありますが)存在しないデータ構造です。C++だと通るらしい愚直解は通らなかったので、この…

77. C# で MultiSet を実装する(大枠の話と列挙アルゴリズムについて)

ここで言う MultiSet とは C++ の multiset を模したデータ構造です。C# に標準で存在しないため、競技プログラミングなどで利用したい場合は自作する必要があります。 MultiSet が満たすべき性質 MultiSet は端的に言うと、順序を保ったまま高速に要素を追…

70. ランダムアクセスが O(1) で可能な双方向リスト

双方向リストは、片方向リストと比較して「前後両方のノードへのポインタを持つ」という点が特徴です。C# では LinkedList として実装されています。 双方向リスト 双方向リストは、以下のような特徴を持ちます。 先頭・末尾への要素追加が で可能 (そのノー…

67. C# による遅延評価セグメント木の抽象化実装

競技プログラミングでよく使われる「セグメント木」というデータ構造があります。 これは、配列データに対して2のべき乗区間ごとに「合計値」「最大値」など注目したい演算を適用しておき、任意の区間に対する演算結果を で取得できるものです。 セグメント…