結果

問題 No.1013 〇マス進む
ユーザー tamato
提出日時 2020-03-20 23:17:06
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,997 bytes
コンパイル時間 357 ms
コンパイル使用メモリ 82,176 KB
実行使用メモリ 97,280 KB
最終ジャッジ日時 2024-12-15 14:57:43
合計ジャッジ時間 11,985 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 49 WA * 13
権限があれば一括ダウンロードができます

ソースコード

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)
    for a in ans[1:]:
        print(a)


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