Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

AtCoder Beginner Contest 266

6完。ABC初の6完。

各問題

A - Middle Letter

s[n/2]

B - Modulo Number

N % 998244353が答え。ですが、c++の場合負の数の剰余は割り切れるときを除いて負の数になるので、その場合は998244353にそれを足せばよいです。

C - Convex Quadrilateral

正直わからなかったので、ググって出てきたソースコードをペタリしたら通りました!!!

D - Snuke Panic (1D)

時刻と現在位置を持ってDPすればよいです。最初は右の方まで行けないことにだけ注意。

E - Throwing the Die

1回のときの期待値はもちろん3.5です。

2回のときは、1回目に1-3が出たときは、振り直すことによって期待値3.5が元の出目を上回るため得です。なので振り直します。4-6が出たときは振り直すと期待値3.5は元の出目を下回るので損します。なので振り直さず確定させます。都合 (3.5 * 3 + 4 + 5 + 6) / 6 で、2回のときの期待値は4.25となります。

3回のときも2回目までの期待値4.25をもって同じことをすればよく、n回のときもn-1回までの期待値をもって同じことをすればよいです。

F - Well-defined Path Queries on a Namori

N頂点N辺の連結グラフなので、木に一つ辺を追加したものになります。よってループは一つです。そして、そのループを経由しない(「かすめる」のはあり)範囲の頂点間については経路が一通りに定まります。

(追記)

「かすめる」っていうか、ループを構成する頂点を根とした木が生える、としたほうがよりよい表現のようです。

(追記ここまで)

(追記2)

このような木に一つ辺を追加したグラフを俗に「なもりグラフ」と呼ぶそうで、問題名の由来でもあるらしいです。(実戦中は問題名ちゃんと見てなかった...)

(追記2ここまで)

実装ですが、まずDFSでループの場所を確定させます。もう1回DFSして、ループを経由しないで繋がれるグループを確定させていきます。(自分はこれについて、頂点毎に代表の頂点を持たせるという実装を自分で書きましたが、今考えたらUnion-Find使えばよかったw)

最後に、クエリ毎に同じグループに属しているかどうかをチェックすればよいです。

まとめ

Cを自分で解いてないのでちょっと味噌付けちゃってますが、ABC初の6完でノーペナですよ!やったね!!

実はCよりFより、苦手な期待値問題のEがよく解けたなということのほうが驚きです。