一応、解けた問題は解法を書きますが、厳密さは重視せず、箇条書きっぽく書きます。(解法ツイートの文字数制限ない版、という感じで)
この回は、Dが解けず、Cまでの三完でした。
コンテストへのリンク
A. New Year and Naming
実装問題
B. New Year and Ascent Sequence
n個の配列から二つを選び連結したとき、$a_i<a_j (i<j)$ となる箇所が存在するものが何個あるかを全探索($O(n^2)$)せずに求める問題。
・そもそも、一つの配列に$a_i<a_j (i<j)$ となる箇所が存在すればどれと連結しても条件を満たす
・そうでないとき、その配列は大きい順にソートされている。
ので、条件を満たすためには、$a_1>a_2>a_3>...>a_n<b_1>b_2>...b_m$のようになっていれば良い.
→あとはソートして、二分探索を使うか、尺取り法でOK。
C. New Year and Permutation
解法として思い浮かぶのは、
・DP or 数学的にcombinationなどを使う (or OEIS)
といったあたりか。
→今回はDPは上手くいかないので、数学的に考える
→幅を固定すれば求まる
幅$k$の配列がhappyになるとき、
- どの数字を選ぶか
- どの位置を選ぶか
- 中身の組み合わせ
- 残りの数字の組み合わせ
を調べればOK
D. New Year and Conference
D, Eはアルメリアさんのブログが詳しいです。私はこれを見て通しました。
・とりあえずソート
は、良いとして、今回は、「開始時間でソートして区間を順番に見ていく」のほかに、「開始、終了時刻をまとめてソートして時間ごとにみていく」という方法があり、後者が正解。
・区間のままみるのではなく、時間ごとにみる
という発想の転換が重要。
(区間のままでも解く方法はあるかもしれないけど分からなかった。遅延セグ木を使ったり、リストのHashを調べたりする解法もあったけど、この発想の転換は必須?)
E. New Year and Castle Construction
偏角でソートは思いついていたけど、その後が考察できなかった。
解説を読んで実装してみたけど、TLEが取れず。Pythonじゃ厳しい?
0 件のコメント:
コメントを投稿