Toy と帽子と ADP BE

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

トヨタ自動車プログラミングコンテスト2023#3(AtCoder Beginner Contest 306)

ABCDFの5完、3WA。

各問題

A - Echo

いわれたことを、やるだけ。for (int i = 0; i < n; i++) cout << s[i] << s[i]; こんな感じで。

B - Base 2

いわれたことを、やるだけ。なのですが、これ long long だとオーバーフローします。(1WA)

私は Java の BigInteger 先生にご登場願いました。

C - Centers

各数が二回目に現れた時の添え字を保存しておき、それをソートすればよいです。

なぜか実装をバグらせ続けて 2WA も出してしまった...。

D - Poisonous Full-Course

DはDPのD。

dp[i番目の料理][おなかの調子(2)] で、食べなかったときと、解毒剤を食べたとき or 毒を食べた時の場合分けで遷移すれば OK です。

E - Best Performances

ぜんぜんわからない...。

F - Merge Sets

すべての数を何個目の集合かを合わせて持ってソートします。それを先頭から見たとき、自分を含めて後の集合の要素がそれぞれ何個出現したかがわかれば、求めたい値はわかります。ここで、一つずつ見ていると間に合わなさそうですが、fenwick_tree で各集合の数がそこまでに何個出現したかを管理しておくと、自分より後ろの集合の要素の出現数の和をすぐに取れるので間に合うようになります。 各要素に対しては「自分自身の集合の要素が何個出ているか」 * 「自分より後ろの集合の数」 + 「自分より後ろの集合の要素が何個出ているか」を計算することになります。

まとめ

Cでひどいはまり方をしてしまい、ABDC の順に通した時点で大爆死を覚悟したのですが、Fが通せたので命拾いどころか青パフォあるかも?あきらめないって大事。

最後の20分は全人類Fを通さないでと祈るげーでした。←いや、E あきらめとるやないかい!

(追記)Unrated になったそうです。ジャッジ遅れのせいで結局青パフォでもなかった。