結果

問題 No.1013 〇マス進む
ユーザー tamato
提出日時 2020-03-20 23:16:27
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,978 bytes
コンパイル時間 264 ms
コンパイル使用メモリ 82,332 KB
実行使用メモリ 97,764 KB
最終ジャッジ日時 2024-12-15 14:34:12
合計ジャッジ時間 9,672 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 3
other AC * 2 WA * 60
権限があれば一括ダウンロードができます

ソースコード

diff #

def main():
    import sys
    from collections import deque
    input = sys.stdin.readline

    N, K = map(int, input().split())
    P = list(map(int, input().split()))

    ans = [-1] * (N+1)
    dest = [0] * (N+1)
    to = [0] * (N+1)
    rev = [[] for _ in range(N+1)]
    for i in range(1, N+1):
        to[i] = i + P[i-1]
        if to[i] > N:
            to[i] -= N
        rev[to[i]].append(i)
    seen = [0] * (N+1)
    for i in range(1, N+1):
        if seen[i] == 0:
            x = i
            cycle = []
            while True:
                if seen[x] == 2:
                    break
                if seen[x]:
                    cycle.append(x)
                seen[x] += 1
                x = to[x]
            #print(i, seen, cycle, ans)
            L = len(cycle)
            cs = [0] * (L+1)
            cs[0] = cycle[0]
            for j in range(L):
                cs[j+1] = cs[j] + P[cycle[j]-1]
            d, m = divmod(K, L)
            ans[cycle[0]] = d * (cs[-1] - cs[0]) + cs[m]
            last = cycle[m%L]
            dest[cycle[0]] = last
            for j in range(1, L):
                v = cycle[j]
                u = cycle[j-1]
                ans[v] = ans[u] + P[last-1]
                last = to[last]
                dest[v] = last
                if cycle[j] <= cycle[j-1]:
                    ans[v] -= N
            c2i = {cycle[j]: j for j in range(L)}
            que = deque()
            for v in cycle:
                for u in rev[v]:
                    if u not in c2i:
                        que.append(u)
            while que:
                v = que.popleft()
                seen[v] = 3
                u = to[v]
                w = cycle[c2i[dest[u]] - 1]
                dest[v] = w
                ans[v] = ans[u] - P[w-1]
                if v >= u:
                    ans[v] += N
                for uu in rev[v]:
                    que.append(uu)
    print(*ans[1:])


if __name__ == '__main__':
    main()
0