Qiitaに書くほどでもないテクニック集(?)

はじめに

思考の整理も兼ねて 緊急時に読み返せるように 昨日のCで解法ガチャがハマったのでこの機にまとめて整理します

このリストが役立つのは水くらいからですかね?

























(ネタバレ防止用の空白)


















二分探索を適用したいとき

  • 最大値の最小化は二分探索!(素振り) 意識しないと抜けがち
  • 単調性が自明だったら二分探索を早めに検討した方がいい? これとか
  • 解の決め打ちで判定できるとき、単調性があるか確かめるとイイ感じに二分探索へ持ち込める(単調性がないこともある→そのときは解の候補を減らしにかかる)
  • $K$番目の値系 最近のABCでN回見た
  • 中央値を取り出す系と二分探索は相性がいい これとか こういうの

↑この相性の良さはもうちょっと一般化できそう

ランレングス圧縮

AGC-Aだとよく見る 値が2種類のときはランレングス圧縮して損はない

ランレングス上で考えて計算量を圧縮する まだ解いてないけどこれもたぶんそう

階差を取る

気づかず破滅するタイプ 実は階差が不変量みたいなの

これ

区間に対する操作は階差を取ると見通しが良くなることが多い

F - Perils in Parallel

D - IOIOI カード占い

偶奇

パズルゲーで真っ先に見るのはこれ

E - Rotate 3x3

偶奇で分けないと一生解けない

a+bとa-bは偶奇が等しい(例: 任意の正の整数tに対し(x+y)(x-y)=2*5tなる整数x,yが存在しないことを示せ)

不変量

ゲームの場合の不変量が一番有名だが、変な操作をする問題でも不変量に気づくことを要求する場合がある

不変量に気づけば別の操作に言い換えられる問題

不変量から別の操作への言い換えを用いる http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2617&lang=jp

↑総和が変わらないことに気づき、累積和をとると累積和配列のswapに帰着される

https://atcoder.jp/contests/agc016/tasks/agc016_d

↑総XORが不変

見るべき候補はそんなに多くない

よくわからない最大最小系は貪欲を考えてみる

C - Min Cost Cycle

$N!$通りから最適なものを選ぶような問題だと最初に最適な順になる比較関数を考えてソートする

D - Zabuton

D - Manga Market

実は間に合う系

2で割る操作とか2倍する操作が絡んでると実は$\rm{log} N$個しか見なくてよくなることがある

C - 半分

E - Reversing and Concatenating

D - Manga Market

操作が$\rm{log} N$回程度で終了するのを見つけるのが本質のことも

C - Lamps

全体で見ると操作がならしO(なんとか)で間に合うやつ JOIに多い(偏見)

C - 鉄道運賃 (Train Fare)

E - 砂の城 (Sandcastle)

B - Joker

更新のあるところだけ更新するとなんか間に合うやつ(全体で何らかの値が1ずつ減っていくような状況を考える)

こういうのは気づかないと一巻の終わりなので大きめのテストケースを生成してストレステストするのが良さげ

とりあえず1か所決めてみる

1か所決めると他が高々数通りしかないやつ

DPとの組み合わせは割と多い

D - Histogram Coloring

F - Square

木が与えられたときに試した方がいい性質

  • 直径
  • 二部グラフ性
  • 中心
  • 重心

この辺見ればほぼ間違いはなさそう

2点取る系はLCAに注目すると良いことが多い

あと上(根)から見るか下(葉)から見るか両方確かめる

どっちから見るか迷うやつ C - Folia

木DPっぽさそうなときは適切なマージが可能か考える 全方位木DPは最後の手段

信じる心/きっと同値

こういう条件を満たしてたらきっと全部作れる/最適っぽさそうなのができるだろうと信じる で、実際全部作れる

例:

C - Minimization

1回の操作で(K-1)個の要素が減るので、操作回数は最小で\frac{N-1}{K-1}の切り上げになりそうだとわかる

で、実際にうまく操作をやれば最小が実現できる

C - ABland Yard

F - Pass

D - Tree and Hamilton Path

やたらと人が通してるように見えたら信じる心系を疑った方がいいかもしれない

逆から見る

A - Limited Insertion

最初の方に行った操作が後の方ではぐちゃぐちゃになってるとき 上書き保存系も逆操作と相性がいい

これは本当に納得いってない 目的のところまで行くには道が多すぎるが、目的のところからスタートへ帰ると見ると楽になる とでも言えばいいのだろうか...

A - Pay to Win

本当に忘れがちなので注意

余事象を取る

AndとOrを反転させる 束縛条件が多いときにやってみるとやりやすくなることがある

余事象をとった後にOrの条件が出てきた場合、包除原理を考えるとよい(Orに対処できるのは包除ぐらいしかない)

マンハッタン距離系

その1. $x$軸と$y$軸でバラす

E - Cell Distance

E - CARtesian Coodinate

その2. 45度回す

(x,y)→(x+y,x-y)

-元の座標でxかy方向に±1動く運動が両方に±1動く運動になる - マンハッタン距離がX座標/Y座標の差のmaxになる

だからといって何でもかんでも回せばいいというものでもないので注意

オイラー路とハミルトン路の行き来

ハミルトン路への帰着が自明なときはオイラー路に変換できないか考える

E - 90-degree Rotations

E - Jigsaw

添え字と値を入れ替えるテク

本番で詰め切れませんでした(泣)

C - スタンプラリー 3 (Collecting Stamps 3)

D - Complexity 解けてないけどこれっぽい

変なマッチングではマッチングアルゴは要らない

B - 展覧会 (Exhibition) ←一見マッチングだが制約が特殊なので、貪欲でOK

B - Powers of two 一般マッチングが脳裏をよぎるが、そんなことはない

変なデータ構造とかアルゴを要求しそうだと思ったら一度立ち止まった方がよさそう 特にAtCoder

困ったら実験

文字通り

おわりに

雑でごめんなさい