noshi91のメモ

データ構造のある風景

2019-01-01から1年間の記事一覧

列の連結/全要素列挙をする永続データ構造

某に載せるほどか...? 載せることにしたらこっちは消えます 以下の操作を実現する永続データ構造が存在する 単一の要素 からなる列を作成する 時間/空間計算量 列 を連結した列を作成する 時間/空間計算量 列 の全要素を順に列挙する 時間計算量 アルゴリズ…

単純な最小カットで表現できる条件

変数 への の割り当てに対してコストが以下の図のようになるとします。 コストを最小化するとき、 ならば最小カットで表現できます。 説明 最小カットで使えるプリミティブな操作を考えます また、解に直接値を加えることで全体に することが出来ます。 量 …

(計算量 k 倍) 上位 k 個を取得する Li Chao Tree

概要 Li Chao Tree で小さいほうから 個取得できる ただし取り出した 個の順番は保証されない 空間計算量 時間計算量 per query アルゴリズム 全てのノードは高々 個の直線を保持します。 元の Li Chao Tree と同様、クエリの点を覆うノードの直線だけでクエ…

木の平方分割、出来るもの出来ないもの

出来ない分割の例 木に対して、頂点集合を に分割する がつながっている: 内の任意の頂点対のパスは に含まれる が小さい: が小さい: 反例: スターグラフ 出来る分割の例 根付き木に対して、頂点集合を に分割する がつながっている: 内の任意の頂点対のパス…

バグ記録

全般 オーバーフロー 降順ループを昇順にする 入力の縦横を間違える 早期 return の return 忘れ コピペの添え字間違い 値の初期化忘れ H と W を間違える return を書き忘れる 順列の逆写像を出力している インタラクティブ 要素数 2N を N と勘違いする 0/…

mod 逆元と拡張ユークリッド互除法

概要 本稿では整数の での逆元について取り扱います。 文中の合同式は です。 拡張ユークリッド互除法で逆元を求める 互除法の手順を高速化できるかもしれないという提案 から の逆元を で計算する 個の数について全ての逆元を で計算する (おまけ) 拡張ユー…

スライド最小値を半群に一般化する

概要 以前記事を書いたのですが消したので別の場所にもう一度書きました。 今度はある程度まともな実装付きです (その分遅いですが)。 Sliding Window Aggregation - data-structures 計算量解析 Queue の場合 ポテンシャル関数を で定義します。 Deque の場…

計算量について、償却/期待/平均など

本記事は皆様からのご指摘を募集しております 誤った記述があるかもしれません 概要 競技プログラミングをやっていると などの表記を見掛けることも多いでしょう *1。 それぞれについて、大雑把な意味をまとめました。 アルゴリズムの挙動の正確な把握は競技…

区間代入/区間積 Θ(logN)/query

概要 遅延セグメント木は様々な区間操作が で可能です。 一方で、代入と積の組み合わせは累乗を計算する必要があり、そのままでは に悪化してしまいます。 本稿では空間計算量を に抑えたまま、 で処理する手法を提案します。 また、積に限らず一般のモノイ…

2-SAT のアルゴリズムの証明

概要 蟻本で 2-SAT のアルゴリズムを最初に見たとき、私はその正当性について何ら疑問を抱きませんでした。 これは私の頭がよく回ったからではなく、単に行間に気づいていなかったからということに最近気づきましたので、反省を兼ねて記録します。 反例のよ…

JSC2019 参加記

A を読む 解けない B を読む 解けない C を読む セグ木で丁寧だけど L/2 付近の挙動が良く分からなかったので放置 D を読む 解けない E を読む パターンマッチング系なのでどうせ S か T で Trie 作って、Aho Corasick すると終わり ひいひい言いながらライ…

添え字 gcd での畳み込みで AGC038-C を解く

概要 数列 に対し、その gcd 畳み込み*1 を以下のように定めます この畳み込みの計算方法と、応用として AGC038-C を解く手順を示します。 数列の変換で要素毎の乗算に変換 数列から数列への関数 を導入します。 は倍数の和を取る変換で、以下のように定義し…

Offline Level Ancestor Θ(N+Q)

概要 シンプルなアルゴリズムですが、Level Ancestor Problem 自体の知名度が低そうなので宣伝を兼ねて紹介します。 Level Ancestor Level Ancestor とは、根付き木について定義される概念です。 の祖先であって、深さが であるもの ( の深さ ) の深さが分か…

2 ポインタ/ノード で親方向を探索する二分木

概要 最もシンプルなポインタによる二分木の実装は、各ノードが左子と右子を保持することでしょう。 一方でこの実装では親方向へ遡ることが出来ません。すると例えば平衡二分探索木のイテレータを実装するときなどに問題になります。 親へのポインタを保持す…

top tree 概要

概要 niuez.hatenablog.com top tree の記事が出ていたので、あまり触れられていない部分を補足していくモチベーションで書きました。 segment tree を知らないと読んでもあまり面白くないと思います。 link cut tree を知っていれば分かりやすいです。 その…

素集合の要素の列挙と併合 (単方向循環リスト)

概要 以下の 2 種類のクエリを処理します。 と同じ集合の要素を全て列挙します。 時間計算量 を含む集合の要素数 がそれぞれ含まれる集合同士を併合します。 が同じ集合に含まれているとバグりますが検出はできません。 時間計算量 理論 同一集合内のノード…

総和に制限のある部分和問題の bitset 高速化

1が18個→1+2+4+8+3 にするやつをして、今回の問題だとそこで新たにできた4ともともとある4は同一視できるから4が1個増えたと思っていいよって下から順番に上の表現に直していくことで、1つ1つの個数を最大2個の状態まで変形することができて、種類数はO(√N)…

ICPC2019国内予選D Ο(NlogN)

予選落ちました 本番で AC しましたが、証明の誤りがありましたらご指摘をお願いします。 解法 c=a-b をして階差を取ると、次のような問題に帰着できます。 c[0]...c[n] があります。「c[i]+=1, c[j]-=1 (i

拡張ユークリッド互除法を非再帰ベースで理解する (C++)

2021/02/18 数式を修正しました 拡張ユークリッド互除法とは 方程式 の解 を 1 つ求めるアルゴリズム*1です。 注意 qnighy.hatenablog.com 書いた後で、概ね同じ内容を説明している記事を見つけました。分かりやすさには個人差があると思うので、本記事にも…

modint 構造体を使ってみませんか? (C++)

2019/04/01 実装例の訂正などを行いました。 2019/04/13 実行時に法が決まる問題についての説明を追加しました。 modint is 何 競技プログラミングの問題で、答えを 1000000007 (あるいは他の素数) で割った余りを求める問題は頻出です。これらの問題ではア…

北大・日立新概念コンピューティングコンテスト2018の出力とかするやつ

概要 正の点を取ってる人が少なくて寂しいので共有します。 私が使っているものと同じですが、バグがあるかもしれません。(あったら私は終わり) 使いたい場合は自由に使ってください、責任は取れませんが... コンストラクタで n と s を指定します。s は x, …

あなたの庭に永続データ構造を飾りませんか?

2019/02/06 永続 Stack のやや丁寧な実装例を追加しました 2020/12/13 数式などを整えました 概要 あなたのライブラリに新しい彩りを与える永続データ構造の紹介です。 永続データ構造とは 永続データ構造とは、普段のデータ構造で更新をするときに更新前の…