C++言語・STLメモ

C++言語や,C++ Standard Template Library の書き方で,忘れやすいものをメモしておくページです.

2021-09-20 · yamate11

Red and Blue Lamps - AtCoder Beginner Contest 218 H

公式解説にある貪欲法の証明を詳しく書きました.

2021-09-13 · yamate11

Shapes -- AtCoder Beginner Contest 218 C

重実装への対処は,どうしたらよいのでしょうか?

2021-09-12 · yamate11

Snuketoon - ABC217 H

slope trick というのは忘れていましたが,そもそもHまで到達しませんでした.この記事は公式解説そのままです.

2021-09-05 · yamate11

「牛ゲー」

「牛ゲー」なる手法のまとめです

2021-08-30 · yamate11

01Sequence - ABC216 G

公式解説とは違う (より効率の悪い) 方法で解きました.

2021-08-30 · yamate11

Three Permutations - ABC 214 G

調べた結果分かった解法を記述します.いろいろ勉強になりました.

2021-08-27 · yamate11

Pass to Next - ARC 124 E

解けませんでした.解説を読んでも分からなかったので,自分なりの説明です.

2021-08-27 · yamate11

Shorten ABC - AtCoder Regular Contest 110 E

解説AC です.公式解説も皆さんの解説もたくさん参考にしています.

2021-08-26 · yamate11

Snack - Atcoder Regular Contest 125 E

解法です.公式解説そのままです.

2021-08-24 · yamate11

Cabbage Master - Atcoder Beginner Contest 215 H

公式解説そのままですけれど,予備知識を一応書きました.

2021-08-23 · yamate11

xor畳み込み

高速アダマール変換によって,xor畳み込みをする方法についての記事 (自分用のメモ) です.

2021-08-23 · 2021-08-12 (初版) · yamate11

文字列,数値変換

C++ での型の変換などのいろいろな変換方法です.

2021-08-20 · 2021-02-07 (初版) · yamate11

Random LIS - Atcoder Regular Contest 104 E

Atcoder Regular Contest 104 (ARC 104) E Random LIS に関する記事です. 問題文へのリンク https://atcoder.jp/contests/arc104/tasks/arc104_e 経緯 過去問埋めで解いてみようとしましたが,全然わかりませんでした. 公式解説 を読んでもやっぱりわからず, けんちょんさんの解説 を読んで,なんとか理解することができました. 解法 例えば,N = 4 として,数列 10 7 10 15 と数列 5 1 5 2000 は, 数値の差こそあれ,大小関係は同一である.これらを 1 0 1 2 というパターンとして 1つのグループとしてまとめることにする.以下を実行する. 全パターンを列挙する. 各パターンについて, LISの長さを求める. そのパターンに属する数列の数を数える. グループがいくつあるかは, Ordered Bell number として知られているということである.N = 6 の場合には,4683個. 丁寧に列挙することもできるであろうが,$6^6 = 46656$ であるから,0 から N-1 までの 数の N 個の並びから,不適なものを弾いても十分速い. 各グループに属する数列では,LIS の長さは同じであり,N <= 6 だからこれを求めるのは容易である. 各グループに属する数列の数を求めるのが主要なタスクとなる. $\{0, 1\} \cup \{A_i + 1\mid i = 1, \ldots, N\}$ を昇順にソートして $p_0, p_1, ....

2021-08-19&nbsp;·&nbsp;yamate11

vector<vector<*>> はあんまり速くない

発端 自分で書いた SCC (強連結成分分解) ライブラリを使っているのですが, これが,AC-library の SCC に比べて,4倍くらい遅いのです. どこが遅いのか調べてみたら,意外なところにもネックがありました. 最初は,主に使っているアルゴリズムのせいだと思ったのです. 深さ優先探索を2回行うアルゴリズム (たとえばここ を参照) を使っていました. AC-library は,Tarjan のアルゴリズム を使っているようなので,合わせれば速くなるだろう,と思って 書きかえました. たしかに速くなったのですが,それでもまだAC-libraryより3倍ほど遅いです. vector<vector<*> > 部分に分けて測定してみたところ,どうも,グラフの情報を設定しているところも 遅い,ということが分かりました. こんな感じのコードなのですが: int N, M; cin >> N >> M; // N は頂点数, M は辺の数 vector<pair<int, int>> edges; for (int i = 0; i < M; i++) { int u, v; cin >> u >> v; // 0-indexed で入力されると仮定 edeges.emplace_back(u, v); } vector<vector<int>> fwd(N); // fwd[i] は,i から直接行ける頂点たち. // (1) for (auto [u, v] : edges) { fwd[u]....

2021-08-16&nbsp;·&nbsp;yamate11