AOJの「データの集合とクエリ処理(DSL)」のコースをC言語で制覇した。
重み付きUnion Find
https://qiita.com/drken/items/cce6fc5c579051e64fab に詳しい解説がある。数値の大小とUnion Findの矢印の向きが少しややこしい。
セグメント木/遅延評価セグメント木
https://cstmize.hatenablog.jp/entry/2020/05/21/%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E6%9C%A8/%E9%81%85%E5%BB%B6%E8%A9%95%E4%BE%A1%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E6%9C%A8%E3%81%AE%E5%AE%9F%E8%A3%85%E3%81%AE%E3%82%B3%E3%83%84 にセグメント木/遅延評価セグメント木の実装のコツを書いた
尺取法
いもす法
いもす法は入力を1次差分(もしくはn次差分)の情報と解釈し、積分してもとに復元することで計算量を落とす手法。本家の解説はここ
https://qiita.com/e869120/items/eb50fdaece12be418faa#%E7%B4%AF%E7%A9%8D%E5%92%8C-1 に例題があって、解答はここ。
座標圧縮
座標圧縮は半開区間[a, b)があって、点a, bをメモ -> 大小関係を保存しつつ数値を小さくする技術。仰々しい名前がついているが単にmap<int(大), int(小)>
で変換するだけ。別にmap[int(小)] => int(大)
という配列を持てばもとの値を復元できる。
https://qiita.com/e869120/items/acba3dd8649d913102b5#%E5%BA%A7%E6%A8%99%E5%9C%A7%E7%B8%AE とか、蟻本の中級編を見ると良い。蟻本では6点メモするみたいなことが書いてあるが、実は2点をメモするだけで十分だったりする。
その他
スライド最小値はdequeというデータ構造を使うのが模範解答(といってもqueueに毛が生えたもので大したものではない)だが、セグメント木でも実装できる。
kD木の問題はX軸とY軸で独立に二分探索することで制限時間に間に合ったのでこれでいいや。
これでも解けるぜ、っていうのがあったら教えて下さいm( )m