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がよく解けたなということのほうが驚きです。