スプレイ木(Splay Tree)の実装詳細と拡張機能解説

スプレイ木の概要 スプレイ木は、動的データ構造の一種であり、二叉探索木のバランスを保つための手法です。Daniel Sleator と Robert Tarjan によって提案されました。その特徴として、明示的なバランス操作を行わずとも、アクセスパターンの履歴に基づいて自動的に調整が行われる点が挙げられます。 この構造では、最近参照された要素を根へと移動させる「スプレイ」操作 ...

5月20日 12:22 投稿

-stackを使用してUnixパスを簡略化する-

問題 Unixスタイルの絶対パス('/'で始まる文字列)が与えられた場合、それを簡略化された標準パスに変換してください。 Unixファイルシステムでは、ドット(.)は現在のディレクトリを表し、2つのドット(..)は親ディレクトリ(1レベル上)に移動を表します。これらは両方とも、相対パスの一部として使用できます。複数の連続するスラッシュ('//')は、単一のスラッシュ ...

5月20日 10:00 投稿

アルゴリズムの計算量:時間計算量と空間計算量の基礎

アルゴリズムの効率性を評価する指標 プログラムの品質を評価する際、コードの可読性や簡潔さだけでなく、「実行効率」が極めて重要な要素となります。アルゴリズムの効率性は、主に以下の2つの観点から測定されます。 時間計算量(Time Complexity): アルゴリズムが実行を完了するまでにかかる時間の目安。 空間計算量(Space Complexity): アルゴリズムが実 ...

5月20日 06:10 投稿

C++における訪問者パターンの変種

1、非破壊シーケンスアルゴリズム これらのアルゴリズムは操作対象のコンテナ内の要素を変更しません。 1.1 find と find_if find(begin, end, value):value に等しい最初の要素を検索し、イテレータを返す(見つからない場合は end を返す)。 find_if(begin, end, predicate):述語を満たす最初の要素を検索する。 find_end(begin, end, sub_begin, sub_end):サブシー ...

5月18日 11:14 投稿

Codeforces Round 984 (Div. 3) 問題の解説

C. Anya and 1100 問題URL Problem - C - Codeforces 解法 文字列中の特定のパターン「1100」の出現回数を管理する問題です。ある位置の文字を変更したとき、それが「1100」の存在にどのような影響を与えるかを考えます。 変更による影響は三種類あります: 「1100」の個数が1増える 「1100」の個数が1減る 変化なし 変更箇所について、それが「1100」のどの位置(1 ...

5月17日 11:24 投稿

セグメントツリーの高度な応用: 区間最小値更新と最大値・和の取得

Gorgeous Sequence: 区間最小値更新・区間最大値・区間和 長さ \(n\) の数列に対して次の操作をサポートする: 0 l r v: 区間 \([l, r]\) の要素を \(v\) との最小値で更新 1 l r: 区間の最大値を取得 2 l r: 区間の和を取得 各ノードで最大値・最大値の出現回数・二番目の最大値を管理。更新時: \(mx \leq v\): 処理不要 \(smx < v < mx\): 最大値のみ更新 \(v ...

5月17日 01:21 投稿

2025牛客暑期多校訓練キャンプ第1回 解説

G. Symmetry Intervals 文字列 $S$ と $q$ 個のクエリが与えられる。各クエリでは文字列 $T$、整数 $a$、および区間 $[l, r]$(ただし実装上は $T$ 全体を対象)が与えられ、$S_{a+x-1} = T_x$ がすべての $x \in [l, r]$ で成り立つような連続部分区間の個数を求める。 アプローチとしては、$T$ の各位置 $j$ に対して対応する $S$ のインデックス $ps = j + a - 1$ を計 ...

5月16日 19:59 投稿

循環配列における次の大きな要素の検出と「雨水を貯める」問題のアルゴリズム解説

503. 循環配列における次の大きな要素 II (Next Greater Element II) 循環配列(最後の要素の次が最初の要素となる配列)が与えられた場合、各要素に対して「次に大きい要素」を見つける問題です。要素xの次に大きい要素とは、配列を巡回順で走査した際、xの後に現れる最初のxより大きな数値を指します。そのような数値が存在しない場合は-1を出力します。 解法アプロー ...

5月16日 17:53 投稿

ICPC 2018 横浜大会における主要アルゴリズムの解説

2018年に開催されたICPCアジア地区予選横浜大会の出題問題より、いくつかの典型的な実装手法とアルゴリズムの考え方を解説します。 1. 文字列と数値の混合ソート 文字列中に含まれる数値とアルファベットを個別に識別し、辞書順および数値の大きさに基づいた比較を行う問題です。主なロジックは以下の通りです。 両文字列が完全に一致する場合は対象外とする。 ...

5月16日 06:48 投稿

二つのソート済み単方向リストのマージアルゴリズム

二つの非減少順(昇順)に整列された単方向連結リストを、一つの新たなソート済みリストに統合する問題。統合後のリストは、元の二つのリストに含まれるすべてのノードを再利用して構成され、追加のメモリ割り当ては不要である。 核心的なアプローチは以下の通り: - **ダミーノード**(仮想ヘッド)を導入し、新規リストの先頭を一貫して扱えるようにする - 結果リス ...

5月14日 23:26 投稿