Toy と帽子と ADP BE

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

京セラプログラミングコンテスト2023(AtCoder Beginner Contest 305)

6完3WA ABC二度目の6完かな?

各問題

A - Water Station

N / 5 * 5 で手前、N / 5 * 5 + 5 で次の給水所の位置が求められる(Nが5の倍数の時は前者がいる位置と一致)ので、Nとの差分が小さいほうを答えます。

B - ABCDEFG

累積和。

まずクッキーの出現位置の最上、最下、最右、最左を求め、その範囲内でクッキーがない位置が求める位置です。

D - Sleep Log

区間ごとの睡眠時間の累積和をとります。ここで、睡眠中の区間はその手前の区間と同じものを入れます。

次に、二分探索で l と r がどの区間に位置するかを求めます。これが起きている区間なら、累積和からそのまま睡眠時間を求めればよいです。睡眠時間中にかかっているなら、その区間中の睡眠時間を計算して求めて足します。

BFS をすればよさそうですが、愚直に全警備員について探索すると TLE します。ここで、例えば隣り合う頂点に体力10と体力20の警備員がいた場合、体力20の警備員がまかなえる範囲が体力10の警備員のそれをすべてカバーできるので、体力20の警備員についてだけ探索すればよいことがわかります。

というわけで、priority_queue を使って体力が多く残っている警備員から動かしていき、警備員が同じ頂点に来た時に体力の大きいほうだけを残すような実装をすれば、無駄な探索をしなくてもよくなります。

F - Dungeon Explore

同じ頂点を無駄に通らないように DFS をすれば最大 (N - 1) * 2 - 1 回で抑えられます。(多分)

ある頂点について、どの頂点から来たかを覚えておき、たどれる頂点のうちまだ訪れていない頂点があればそちらへ、すべての頂点を訪れていれば元の頂点に戻る、とすれば DFS できます。

まとめ

E まで通したとき、体感とパフォが一致しないなーと思ったのですが、Fがそんなに難しくなかったからか...。