#noredirect
を付けた URL {{ page.url | relative_url }}#noredirect を利用してください。
70 | #noredirect
を付けた URL {{ page.url | relative_url }}#noredirect を利用してください。
8 | 25 | 26 |「イベントソート」という語を急に見るようになったけど、これはABC128Eの解説が初出でかつ書いたのは @potetisensei という理解であってる? 名前が付いてほしいと思ってたテクだから助かる
— うさぎ (@a3VtYQo) May 31, 2019
27 | 28 | -------------------------------------------------------------------------------- /_tenkeis/gyaku-shori.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: なにかを順番に処理するとき、逆から処理するとうまくいくことがある。union-find 木などのような、追加はできるが削除はできない構造を使う場合に多い。 9 | draft: true 10 | draft_urls: [] 11 | --- 12 | 13 | # 逆から考える 14 | -------------------------------------------------------------------------------- /_tenkeis/gyou-retsu-tyouten.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 大きさ $H \times W$ のマス目の上のなにかの連結性を考えるなどの場合に、行と列のそれぞれに対応する $H + W$ 個の追加の頂点を考えるとうまくいくことがある。 9 | draft: true 10 | draft_urls: [] 11 | --- 12 | 13 | # 行や列に対応する頂点を作る (名称募集中) 14 | -------------------------------------------------------------------------------- /_tenkeis/hakoneekiden-dp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 記事作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | algorithm: 9 | aliases: ["箱根DP", "箱根駅伝", "箱根"] 10 | description: 区間の集合を構成するような DP であって「左端は決まったが右端はまだ決まってない区間の数」と「右端は決まったが左端はまだ決まってない区間の数」を状態とする DP のこと。 11 | --- 12 | 13 | # 箱根駅伝 DP 14 | 15 | 箱根駅伝 DP とは、区間の集合を構成するような DP であって「左端は決まったが右端はまだ決まってない区間の数」と「右端は決まったが左端はまだ決まってない区間の数」を状態とする DP のこと。状態が何であるかに基づく DP の分類のひとつ。 16 | 17 | ## 例題 18 | 19 | - [AOJ 2439: 箱根駅伝](https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2439)[archive.org](https://web.archive.org/web/20210102030307/https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2439) 20 | - この問題が呼称の由来である。 21 | - [AtCoder Beginner Contest 134: F - Permutation Oddness](https://atcoder.jp/contests/abc134/tasks/abc134_f)[archive.org](https://web.archive.org/web/20201203225527/https://atcoder.jp/contests/abc134/tasks/abc134_f) 22 | -------------------------------------------------------------------------------- /_tenkeis/in-place-dp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | algorithm: 9 | aliases: ["インラインDP", "実家DP"] 10 | description: in-place DP とは、セグメント木や convex hull trick を用いて DP を高速化すること。。DP の高速化手法のひとつ。あるいは、実装方法に基づく DP の分類のひとつ。 11 | draft: true 12 | draft_urls: ["https://web.archive.org/web/20200113085207/http://topcoder.g.hatena.ne.jp/skyaozora/20171212/1513084670"] 13 | --- 14 | 15 | # in-place DP 16 | -------------------------------------------------------------------------------- /_tenkeis/kakuchou-graph.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 拡張グラフとは、もともと与えられたグラフを何らかの方法で拡張したグラフのこと。もともとの頂点の集合 $V$ と時刻の集合 $\lbrace 0, 1, \dots, T - 1 \rbrace$ の直積 $V' = V \times \lbrace 0, 1, \dots, T - 1 \rbrace$ を新しいグラフの頂点集合とすることが多い。たいてい Dijkstra 法と共に用いられることが多い。 9 | draft: true 10 | draft_urls: ["http://tutuz.hateblo.jp/entry/2019/01/26/134215"] 11 | --- 12 | 13 | # 拡張グラフ 14 | -------------------------------------------------------------------------------- /_tenkeis/keta-dp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 桁 DP とは、自然数の \(10\) 進数展開などを桁ごとに決定していくような DP のこと。状態の持ちかたによる DP の分類のひとつ。 9 | draft: true 10 | draft_urls: [] 11 | --- 12 | 13 | # 桁 DP 14 | 15 | 桁 DP とは、自然数の \(10\) 進数展開などを桁ごとに決定していくような DP のこと。おそらくは状態の持ちかたによる DP の分類のひとつ。 16 | 17 | 特に「自然数 $n \lt L$ であって条件 $\varphi(n)$ を満たすものの個数を求めよ」のような形式の問題の際によく現れる。 18 | このときは「現時点までずっと $L$ と一致している」場合の (あるひとつの) 値と「もう $L$ より真に小さいことが確定した」場合の値たちとを管理すればよい。 19 | 20 | ## 例題 21 | 22 | - [AtCoder Beginner Contest 129: E - Sum Equals Xor](https://atcoder.jp/contests/abc129/tasks/abc129_e)[archive.org](https://web.archive.org/web/20210121051948/https://atcoder.jp/contests/abc129/tasks/abc129_e) 23 | 24 | 25 | ## 厳密な定義について 26 | 27 | 厳密な定義はかなり揺れる。構成途中の文字列を状態とする DP や、数字列 (あるいは記号の種類数が少ない文字列) 上のオートマトン DP と理解されることもある。 「境界となる自然数 $N より小さくなることが確定したか」のフラグを状態とする DP だと言う人もいる。 28 | 29 | 30 |どうやらそうみたいで泣いちゃった
— やる:履修申請、大学駐車場、保険2、ラッシー作る 買う:氷、ヨーグルト、非遮光カーテン、手袋 (@potetisensei) May 31, 2019
31 | 32 | 33 |桁dpって「この値を超えることが確定していますか?」を状態に持つのが最大の特徴だと思っていて、これがあるかどうかが僕の中では桁dpと認識するかどうかの判定基準になっています
— こるとん (@kyort0n) February 16, 2020
34 | 35 | 36 |桁でDPすれば何でも桁DPでは(前処理用に上限設けずにやる系も含めて)
— 有為 (@uwitenpen) February 16, 2020
37 | 38 | -------------------------------------------------------------------------------- /_tenkeis/kihonteiri-kityaku.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 「区間 $\lbrack l, r)$ に含まれる整数 $x \in \lbrack l, r)$ であって条件 $\varphi(x)$ を満たすものの個数を求めよ」という問題は「$n$ 未満の自然数 $x \in n$ であって条件 $\varphi(x)$ を満たすものの個数を求めよ」という問題に帰着するとよい。微分積分学の基本定理を思い出すとよい。 9 | draft: true 10 | draft_urls: [] 11 | --- 12 | 13 | # 区間から始切片への帰着 (名称募集中) 14 | -------------------------------------------------------------------------------- /_tenkeis/min-saiki-bunkatsu.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 列に対する値を求めたいとき、列をその最小値で分割して再帰的に計算するとうまくいくことがある。 9 | draft: true 10 | draft_urls: ["https://kimiyuki.net/blog/2020/07/27/recursion-on-cartesian-tree/"] 11 | --- 12 | 13 | # 列を最小値で分割して再帰する (名称募集中) 14 | -------------------------------------------------------------------------------- /_tenkeis/modosu-dp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 戻す DP とは、DP の遷移の逆演算を用いる DP のこと。DP の高速化手法のひとつ。あるいは、実装方法に基づいた DP の分類のひとつ。 9 | draft: true 10 | draft_urls: ["http://sigma425.hatenablog.com/entry/2015/07/31/121439"] 11 | --- 12 | 13 | # 戻す DP 14 | 15 | TODO: セグメント木を用いて両側からやるタイプはこれ? それとも別? 16 | 17 | ## 例題 18 | 19 | - [AtCoder Regular Contest 028: D. 注文の多い高橋商店](https://atcoder.jp/contests/arc028/tasks/arc028_4)[archive.org](https://web.archive.org/web/20210123190024/https://atcoder.jp/contests/arc028/tasks/arc028_4) 20 | - [AtCoder Beginner Contest 144: F - Fork in the Road](https://atcoder.jp/contests/abc144/tasks/abc144_f)[archive.org](https://web.archive.org/web/20210116210859/https://atcoder.jp/contests/abc144/tasks/abc144_f) 21 | - 影響度を計算して修正をする 22 | -------------------------------------------------------------------------------- /_tenkeis/nijou-ki-dp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 二乗の木 DP とは、計算量が一見 \(O(N^3)\) に見えるが実は \(O(N^2)\) であるようなある種類の木 DP のこと。実装方法と計算量による DP の分類のひとつ。 9 | draft: true 10 | draft_urls: ["https://web.archive.org/web/20150920041654/https://topcoder.g.hatena.ne.jp/iwiwi/20120428/1335635594", "https://snuke.hatenablog.com/entry/2019/01/15/211812"] 11 | --- 12 | 13 | # 二乗の木 DP 14 | -------------------------------------------------------------------------------- /_tenkeis/product-bunkai.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: $H \times W$ の行列 $A$ を適切に 構成したいとき、長さ $H$ のベクトル $b$ と長さ $W$ のベクトル $c$ を作り、行列 $A$ を $A _ {y, x} = f(b_y, c_x)$ (あるいは $A = b c^T$) として生成するとうまくいくことがある。 9 | draft: true 10 | draft_urls: [] 11 | --- 12 | 13 | # 重ね合わせに分解する (名称募集中) 14 | -------------------------------------------------------------------------------- /_tenkeis/separation-of-variables.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 変数分離とは一般には微分方程式を解くための手法であるが、競技プログラミングにおいても類似の手法を用いることが多く見られる。 9 | draft: true 10 | draft_urls: ["https://kimiyuki.net/blog/2020/11/04/separation-of-variables/"] 11 | --- 12 | 13 | # 変数分離 14 | -------------------------------------------------------------------------------- /_tenkeis/snakes.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 平面上の構築問題ではなにかをヘビ状に配置するとうまくいくことが多い。 9 | draft: true 10 | draft_urls: https://kokiymgch.hatenablog.com/entry/2017/12/12/153419 11 | --- 12 | 13 | # ヘビ 14 | -------------------------------------------------------------------------------- /_tenkeis/tanten-renketsu.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: entry 3 | changelog: 4 | - summary: 見出し作成 5 | authors: kimiyuki 6 | reviewers: 7 | date: 2020-01-16T00:00:00+09:00 8 | description: 端点を共有する区間の間に辺を張って、区間を頂点とするグラフを作ると、これはよい性質を持つことがある。 9 | draft: true 10 | draft_urls: [] 11 | --- 12 | 13 | # 端点を共有する区間をつないでできるグラフの連結成分 (名称募集中) 14 | -------------------------------------------------------------------------------- /assets/css/style.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 | @import "style" 5 | -------------------------------------------------------------------------------- /assets/img/.gitignore: -------------------------------------------------------------------------------- 1 | # Tikz/PGF 2 | *.aux 3 | *.div 4 | *.log 5 | *.pdf 6 | -------------------------------------------------------------------------------- /assets/img/README.md: -------------------------------------------------------------------------------- 1 | # assets/img 2 | 3 | ## この README.md について 4 | 5 | 後から画像を修正する必要が発生したときのために、画像の編集方法をこのファイルに書いておきましょう。 6 | 7 | 8 | ## virtual-tree-example-in.svg 9 | 10 | Graphviz を使っています。 11 | 以下のようにコンパイルしてください。 12 | 13 | ```console 14 | $ dot -T svg virtual-tree-example-in.dot > virtual-tree-example-in.svg 15 | ``` 16 | 17 | 18 | ## virtual-tree-example-out.svg 19 | 20 | ```console 21 | $ dot -T svg virtual-tree-example-out.dot > virtual-tree-example-out.svg 22 | ``` 23 | -------------------------------------------------------------------------------- /assets/img/virtual-tree-example-in.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | graph [ 3 | bgcolor = transparent, 4 | ] 5 | node [ 6 | shape = circle, 7 | fillcolor = white, 8 | style = filled, 9 | ] 10 | 1 -> 2 11 | 1 -> 3 -> 4 -> 5 -> 6 12 | 5 -> 7 13 | 5 -> 8 -> 9 14 | 4 -> 10 15 | 4 -> 11 16 | 3 -> 12 -> 13 -> 14 17 | 3 -> 15 18 | 7, 9, 11, 13, 14 [ 19 | shape = doublecircle, 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /assets/img/virtual-tree-example-in.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 192 | -------------------------------------------------------------------------------- /assets/img/virtual-tree-example-out.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | graph [ 3 | bgcolor = transparent, 4 | ] 5 | node [ 6 | shape = circle, 7 | fillcolor = white, 8 | style = filled, 9 | ] 10 | { 11 | edge [ color = transparent ] 12 | 1 -> 2 13 | 1 -> 3 -> 4 -> 5 -> 6 14 | 5 -> 7 15 | 5 -> 8 -> 9 16 | 4 -> 10 17 | 4 -> 11 18 | 3 -> 12 -> 13 -> 14 19 | 3 -> 15 20 | } 21 | 7, 9, 11, 13, 14 [ 22 | shape = doublecircle, 23 | ] 24 | 25 | 1, 2, 6, 8, 10, 12, 15 [ 26 | color = transparent, 27 | fontcolor = transparent, 28 | ] 29 | { 30 | edge [ constraint = false ] 31 | 3 -> 4 -> 5 -> 7 32 | 5 -> 9 33 | 4 -> 11 34 | 3 -> 13 -> 14 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /assets/img/virtual-tree-example-out.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 234 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | # Kyopro Encyclopedia of Algorithms (ア辞典) 2 | 3 | これは競プロの知見を収集するための査読付きの半共有 wiki である。 4 | アルゴリズムについての説明が中心となっている。なお、データ構造については [scrapbox.io/data-structures](https://scrapbox.io/data-structures/) (通称: デ wiki) を利用するのがよいだろう。 5 | 6 | 個人ブログの記事として情報を書くと属人性が高すぎ、古い記事のメンテのコストが高く、記事が不正確なまま残りやすいという問題があった。一方で誰でも自由に編集できる共有 wiki であると属人性が低すぎ、誰が書いたのかが分かりにくいため適切なクレジットが行なわれず、また記事の正確性も担保されないという問題があった。 7 | そこでこの半共有 wiki は、GitHub 上のプルリクエストとレビュープロセスという管理形態を用いて、これらの問題の解決を目指している。 8 | もし興味があれば [kmyk/algorithm-encyclopedia](https://github.com/kmyk/algorithm-encyclopedia) から編集に参加してほしい。 9 | 10 |桁DPは単に数字列のオートマトン上でのDP全般だろ...
— 精進 (@shojin_comp) February 16, 2020