以下の内容はhttps://blog.hamayanhamayan.com/entry/2017/06/07/234608より取得しました。
二部グラフ判定(二部グラフを頂点倍化Union-Findで判定する話も)
全通りの組合せを考えて答える(特有のパターンがある?)
bitsetによる64倍高速化
- 用法
- 【1】到達性チェック
- 【2】yes/no系動的計画法高速化
- 【3】64倍速SCCというのがあるらしい
- 問題
- 非想定bitset
- bitsetのfind_first, find_next 解説 よく分かってない。紹介問題も必須機能ではないみたい
- 比較開始位置のmod 64がずれると比較回数が2倍になってしまうので、開始位置 mod 64の値毎にbitsetを持つと高速化できて通る 出典
回文
- テク
- 奇数個の文字が1つ以下であれば並び替えて回文できる
- 回文の回転にはある種の周期性がある
- ある文字列を回文にするときに回文として対応する文字のペアは独立に決定できる
- 回文と区間DPは相性がいい
N頂点N辺のグラフ、Functional Graph
- 連結「なもりグラフ」
- N頂点N辺の無向グラフはなもりグラフと言い、連結であれば1つだけ閉路が存在する
- 有向なもりグラフもある(出次辺がそれぞれ1つ)
- N頂点N辺の無向グラフで全ての頂点から1は辺が出ているとき、連結成分で纏めると全て閉路になるので連結成分毎に頑張る
一端を固定して、もう片方を伸ばしていくと状態変化がそんなに無いので分割統治っぽくでき、高速に処理できる
- ある配列の左端を固定して、右端を動かしながらANDやORを取るとする。すると、求まるAND,ORはそれぞれ高々32通りしかない。
- ある配列の左端を固定して、右端を動かしながらgcdを取っていき、gcdが同じ要素をまとめていくとO(logN)グループしか無い
- 類題
入力がランダムの場合のテク
- ランレングスが使えるかも
- 再構築回数が少ない(もしくは再構築対象が小さい)場合は、愚直に再構築しても間に合う
実はそんなに数が無い
- 種類数がsqrt(N)になることを使うテク
- a^pの形で書ける数は10^18が上限だとp=2だけとても多いけど、それ以上は全然無いから全列挙、ソート、重複削除でダブリなしで数えられる
不変量を使った問題
- ある種の変換について、ある不変量がある場合は、それを用いることで効果的に計算ができる
- 問題
- 差分をとると実はswap
- 「個数制限付き」「複数個で1つのまとまり」なナップサックは、貪欲法をまずはしてから、DPをする
- 問題
Sliding Window Aggregation
- 解説1 解説2
- stackを2つ使ってqueueを作る手法
- 累積和を取ることで、queueとしての基本機能+queueに入っている要素に対する演算がならしO(1)で行える
- queueだけでなくdequeも構築可能
- 問題
小ネタ、小テク
- 特殊な座圧によるクエリ対応
- modを取ると数は半分以下になる
- 最大値、最小値の区間をstackで持ちながら[0,i]の範囲での最適解を得ていくテクがある
- 特殊な制約により計算量が抑えられる系
- 「K≦10^5でs1+s2+...+sK≦10^5」で任意のペアについてクエリを処理するとき、サイズが小さい方で全探索するようにクエリを実行するとメモ化などで間に合う これ
- どんなに意地悪してもTLEさせられないという面白いやつ
- クエリの要素数によって場合分けを行うことでならしで間に合わせることができたりする これ
- 条件を少しずつ変えて全探索は差分を計算することで全てを計算し直さずに全探索できる これ
- より制約の緩い問題を解くことに帰着する
- 「f(x) := コストがxの時の組合せ」を解くとするときに
- 「g(x) := コストがx以下の時の組合せ」を解くのが優しい場合は、それを解いてf(x) = g(x) - g(x-1)を答えとする
- この問題
- 数列の中に順列が含まれていて、順列がどんな形でも関係ない場合に、特定の順列のパターンは全てのパターン÷順列のパターンで求められる
- この問題
- この問題では順列が含まれるのではなく、複数個同じ数が含まれない数列を含む
- 特定の数列を含む数え上げは難しいので、同じ数が含まれない長さMの数列を含む数列を数え上げて、同じ数が含まれない長さMの数列のパターンで割って求めている
- 「ある盤面が列または行のスワップ操作だけで全部白にできますか?」→全ての2x2のsubrectangleについて黒マスの個数が偶数
- 一度グループになったら、分かれないみたいなやつは逆から見てくとうまくいく場合がある
- setで区間を保持しながら解く
- 右手法という方針がある
- 双方向リスト
- stackを利用した問題
- Zero-one principle「長さ N の任意の 0/1 列がソートできることと、長さ N の任意の順列がソートできることは同値」
- ある集合をグループ分けするときに、適切に正規化することで、同一グループに属すものが同じ値になることを利用する
- クエリ先読み
- グリッドグラフは二部グラフ(+フロー)
以上の内容はhttps://blog.hamayanhamayan.com/entry/2017/06/07/234608より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます
不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14