Official

F - 部分列/Subsequence Editorial by sounansya


問題は以下のように言い換えることができます。

  • 以下の条件を満たす整数列 \((i_1,i_2,\ldots,i_N)\) が存在するか判定してください。
    • \(1\le i_1 < i_2 < \ldots < i_N \le M\)
    • \(1\le k\le N\) に対し \(A_k=B_{i_k}\)

この言い換えから、 \(i_1\) から順番に探索する際、 \(i_1\) の選択肢が複数あった際にその中で最も小さい値を採用しても良いことが分かります。 これにより前から順番に決めていく貪欲が正答であることが分かります。

実装例(Python3)

n, m = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
idx = 0
for v in a:
    while idx < m and b[idx] != v:
        idx += 1
    idx += 1
print("Yes" if idx <= m else "No")

posted:
last update: