あるエンジニアのAtCoder奮闘記

東京都港区にあるアミフィアブル株式会社のエンジニアが、AtCoderで解いた問題について振り返ったりしていく会社公認のブログです。

AtCoder AGC 034 A - Kenken Race (Python)

irisruneです。Pythonを勉強し始めたので解ける問題はPythonで解くことが多くなると思います。

atcoder.jp

一見難しそうで思いつけば簡単…と思わせて引っ掛けポイントがある、そんな問題だと思います。

import sys
n, a, b, c, d = [int(x) for x in input().split()]
s = input()
for i in range(a, max(c, d)):
    if s[i - 1: i + 1] == "##":
        print("No")
        sys.exit()
if c < d:
    print("Yes")
    sys.exit()
for i in range(b - 1, d):
    if s[i - 1:i + 2] == "...":
        print("Yes")
        sys.exit()
print("No")

大体解説の通りですが気付く必要があるポイントは3つあり、

  • 区間[A, C], [B, D]のいずれかで岩が2つ連続する部分が存在する場合、題意は達成不可能。
  • D\lt Cの場合、すぬけくんがふぬけくんを追い越すために岩のないマスが3つ連続する部分が必要。
  • すぬけくんがふぬけくんを追い越すためのスペースは区間[B-1, D+1]に存在する必要がある。

以上3つを守れば問題を解くことができます。特に見逃しやすいと考えたのは3つ目で、すぬけくんが通過する必要のある区間[A, C]のうち、ふぬけくんを追い越すことができるのはふぬけくんが通過する区間[B, D]のみとなります。そして追い越すためには岩のないスペース3つが必要なのですが、そのうち真ん中の1マスにふぬけくんがいればよいので、区間[B-1, B+1], [D-1, D+1]に岩がない場合でも追い越すことが可能となります。

長々と説明しましたが、解説のように区間[B, D]のいずれかのマスを中心とした3マス分のスペースと考えた方がわかりやすいですね。

雑記

  • 岩の有無を1と0に変換した上でベクトル化するとnumpyを使ってうまく解けるかもしれません。
    • 累積和を計算して、区間ごとの累積和の差を行列化する形にすればよさそうでしょうか。