公式

C - Long Sequence 解説 by sounansya


手順通りに愚直に配列を連結していくと実行時間制限やメモリ制限に引っかかるので、別の方法を考えます。

\(B_K\)\(A\) の中のどの整数列の何番目の要素かを求めることを考えます。

手順を順に考えることで、 \(A\) の中のどの整数列の要素かは \(\displaystyle \sum_{j=1}^{k-1} L_jC_j < K\) を満たす最大の \(k\) に対する \(A_k\) であることが分かります。

これらを踏まえると、答えは以下のステップで求めることができることが分かります:

  • \(i=1,2,\ldots,N\) に対して以下を行う:
    • もし \(K \le L_iC_i\) ならば求める値は \(A_i\)\(C_i\) 回連結させた整数列の \(K\) 番目の要素、つまり \(A_{i,(K-1)\bmod L_i + 1}\) が答えである。
    • それ以外の場合、\(K\)\(K-L_iC_i\) に置き換える。

以上を適切に実装することでこの問題に正答することができます。

実装例(Python3)

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
k -= 1
a = []
for i in range(n):
    aa = list(map(int, input().split()))[1:]
    a.append(aa)
c = list(map(int, input().split()))
for i in range(n):
    if k < c[i] * len(a[i]):
        print(a[i][k % len(a[i])])
        break
    k -= c[i] * len(a[i])

投稿日時:
最終更新: