典型90問
キーワード(E869120様Twitterより)
001: 二分探索
002: 小さい制約は全探索を考えよう
003: 木の直径は最短距離計算を 2 回やる
004: 扱いやすい形にして前計算しよう
005: 余りを持って桁 DP
006: 辞書順最小は前から貪欲法
007: 要素の検索はソートして二分探索
008: 状態 DP による高速化
009: 真ん中決め打ち + 偏角ソート
010: 区間の総和は累積和
011: 仕事は締切の早い順に、ソート順に DP
012: 連結判定は Union-Find
013: 各頂点への最短経路はダイクストラ
014: ソートして貪欲法
015: 調和級数は O(N log N)
016: 工夫した全探索
017: 条件を式で表してみる、余事象を考える、 BIT で高速化
018: 三角関数を使いこなそう
019: 列の操作は区間 DP
020: 整数で処理して誤差をなくそう
021: 強連結成分分解(SCC)をしよう
022: 最大公約数はユークリッドの互除法
023: 小さい制約は bit 全探索、ビット DP で高速化、 DP の遷移を細かくする、不要な状態を削る
024: パリティを考える
025: まとめて考える探索/複雑な構造の全探索は再帰関数
026: 二部グラフの性質を使おう
027: map を使いこなそう
028: 領域加算は二次元いもす法
029: 「座標圧縮」で効率化、区間に対する処理は「セグメント木」
030: 素因数列挙の計算量は O(N log log N)
031: Grundy 数を知っていますか?
032: 小さい制約は順列全探索
033: コーナーケースに気をつけよう
034: 単調性を利用した尺取り法
035: 木 DP をしよう、木の経路の長さは LCA 、木の“座標圧縮”を O(K log N) で
036: マンハッタン距離は 45 度回転
037: DP をセグメント木で高速化
038: オーバーフローに注意
039: 答えへの貢献度を考える
040: 「燃やす埋める問題」に帰着させる
041: 凸包を求めるアルゴリズムを理解しよう、 $ x÷y の切り上げは $ \lfloor (x + y - 1) ÷ y \rfloor 、ピックの定理による数え上げ
042: 9 の倍数の性質
043: 拡張 BFS ・ダイクストラ
044: 見かけ上の変化をメモ
045: bit DP /部分集合の部分集合は $ 3^N 通り
046: 同じ意味のものをまとめて考える
047: “3 種類”のものは 0・1・2 に置き換え、文字列一致判定はローリングハッシュ
048: 上界と下界を見積もる
049: 条件の言い換え/最小全域木を求めよう
050: 漸化式を立てて DP をしよう
051: 半分全列挙をしよう
052: 因数分解をしよう
053: インタラクティブに慣れよう、凸関数の最大値は三分探索、微分して二分探索、黄金分割探索を知ろう
054: グラフの辺数を削減
055: 「定数倍」を見積もる
056: DP 復元
057: 行列の掃き出し法を知ろう
058: 周期性を考える
059: DAG を使いこなそう、ビット演算で 64 倍高速化、<おまけ> SCC → DAG
060: 両側から考える/最長増加部分列
061: deque を知っていますか?
062: 後ろから考える
063: 変な制約に着目する/状態数が少ない変量を全探索
064: 階差を考えよう
065: 二項係数を使おう、少ない方を考えると考察が進む場合がある、畳み込みを知っていますか?
066: 期待値の線形性
067: N 進法展開を理解しよう
068: クエリ先読み/ std::set
069: $ a^b \bmod m は繰り返し二乗法
070: x, y 独立に考える