ブログ名

競技プログラミングやお歌のお話をする高菜です。

AtCoder Beginner Contest 165

結果

f:id:ngtkana:20200502225039p:plain

01:09:34(1) 全完です。

A - We Love Golf (00:01:12)

切り上げと切り下げで比較です。

B - 1% (00:03:00)

101 を掛けるとオーバーフローしますから、利息分を計算してたし算です。

C - Many Requirements (00:18:21)

激ムズです。やり方を間違えているのでしょうか……

A としてありえる個数は  \frac { (N + M) ! } { N! \cdot M! } 通りしかありません。 20 の階乗が出てきてまずそうに見えるのですが、実はこれは案外、間に合います。 カタラン数を憶えていると、およその大きさが分かるかもしれません。

これを DFS で全列挙し、スコアを計算です。

感想

はじめ、不等号の下の見逃していて、bit 全探索を書いていました。

bit 全探索の回は焼け野原になります。私は知っていますをしていたのですが、 それどころでなく難しかったですね。

とはいえ 15 分はさすがに掛かりすぎでしょう。

D - Floor Function (00:22:28)

まず、x を b で割って、x = bq + r と表しましょう。 あら不思議 q の項が消えますね。

ということは、q に依存しませんから、q = 0 のときだけを考えると良いです。 またまたあら不思議です。

今度は単調増加ですから最も大きいものを選ぶと良いです。

感想

珍しくギャグです。

E - Rotation Matching (00:49:04(1))

あーっ! さてはまたギャグですね!?

洞察のプロですから、見えちゃうんですよね〜〜〜 幅が全部バラバラなら OK ですから、ハンバーガーのように 16, 25, 34 と選んで AC です。

……って、通らないではありませんか(泣)

落ち着いて考えてみました。 そうです。幅には 「補」(complement) が存在します。 特に偶数のときには牙を剥きます。 たとえば、

入力

2 6

のときに、

出力

1 4
2 3

としてはいけません。

この場合は 1 4 を少し伸ばして 1 5 にするとよいです。

一般には、内側から順に書いていって、被りそうになったら一つ伸ばすをするとよいです。

感想

ギャグなどと言ってしまって、申し訳ありませんでした(泣)

F - LIS on Tree (01:19:34)

このセットのオアシス、典型地力問題です。

みなさん、LIS の求め方をご存知でしょうか。 最も有名なものは、

dp[ 長さ ] = 終端の値

でしょう。

今回は、祖先の情報をすべて持った状態で DFS をするのが良さそうです。 ですから、第一に思いつくのは、この DP 配列を持って廻ることです。 しかし、これはうまく行きません。というのも、頂点を脱出するときに、DP を「戻す」ことができないからです。

ところで LIS は、キーと値を逆転して

dp[ 終端の値 ]  = 長さの最大値

としても、(セグツリーなどを使うと)計算することができます。 こちらならば、(キーをディスティンクトにしておけば、)DP を「戻す」ことができます。

今回はこちらが良さそうです。

やることは伝わったと思うのですが、前処理が必要です。 具体的には、座標圧縮と頂点の値のディスティンクト化です。 ディスティンクト化は、今回は LIS の定義に等号がありませんから、同じ値の頂点ならば祖先のほうが大きいとすると良いです。

これを一度に行うために、 DFS で訪問順を計算しておき、a の値と、訪問時刻の逆順との辞書式順序でソートすると圧縮ができます。