きろく

特筆すべき記録のまとめ

AtCoder Beginner Contest 132:C - Divide the Problems

問題

https://atcoder.jp/contests/abc132/tasks/abc132_c

解法

(N / 2 + 1 番目に難しい問題の難易度, N / 2 番目に難しい問題の難易度] のどれかを K と設定するのがよい.ソートすればこれは求まる.O(NlogN).

解答

https://atcoder.jp/contests/abc132/submissions/6351673

f:id:babcs2035:20190713134530p:plain

 

AtCoder Beginner Contest 130:F - Minimum Bounding Box

問題

atcoder.jp

解法

x_max, x_min, y_max, y_min の座標となる点が変化するタイミングのみ調べればよい.なぜならば,変化するタイミング間では求める面積は広義単調増加・減少になるので,間ではなく両端のタイミングでその区間での面積の最大・最小となっているから.このタイミングは,左右それぞれに動くもののうち x 座標が最大・最小となる点同士,上下それぞれに動くもののうち y 座標が最大・最小となる点同士がぶつかるときになる.また,それぞれ x, y 座標が固定であるもののうち x, y 座標がそれぞれ最大・最小である点ともぶつかるときの面積も調べる必要がある.O(N).

解答

atcoder.jp

f:id:babcs2035:20190712145129p:plain

 

AtCoder Beginner Contest 130:E - Common Subsequence

問題

atcoder.jp

解法

まず,問題文の解釈から.選んだ部分列の数字を文字列を連結させて読むのではなく,数列としてみたときに等しいものの個数を求める.例えば {1, 3, 3, 3} と {1333} は,各項を文字列としてみて連結させると同じものになるが,数列としてコンマ区切りで見ると当然同じではない.

以下の DP を考える.

dp(i, j) := S_i, T_j までありうる共通の部分列の個数の和

遷移は

dp(i, j) = dp(i - 1, j) + dp(i, j - 1) - dp(i -1, j - 1) (S_i == T_j のとき + dp(i - 1, j - 1) を追加でする)

となる.- dp(i - 1, j - 1) をしているのは,dp(i - 1, j) と dp(i, j - 1) の中で dp(i - 1, j - 1) を重複して数えてしまっているため.全体で O(NM).

解答

atcoder.jp

問題文の解釈を間違っていたため Virtual コンテスト中に解けなかった...

f:id:babcs2035:20190712131704p:plain